← Strings

String Compression

Easy
Python
def compress(s):
    res=''; i=0
    while i<len(s):
        c=s[i]; cnt=0
        while i<len(s) and s[i]==c: cnt+=1; i+=1
        res+=c+(str(cnt) if cnt>1 else '')
    return res if len(res)<len(s) else s
Java
public String compress(String s){
    StringBuilder sb=new StringBuilder(); int i=0;
    while(i<s.length()){
        char c=s.charAt(i); int cnt=0;
        while(i<s.length()&&s.charAt(i)==c){cnt++;i++;}
        sb.append(c); if(cnt>1) sb.append(cnt);
    }
    String r=sb.toString();
    return r.length()<s.length()?r:s;
}

Key Insight

Run-length encoding. Python ternary vs Java ? : syntax.

Python → Java Differences

  • string += vs StringBuilder
  • Python ternary x if c else y
  • Java ternary c?x:y
Python
def compress(s):
    res=''; i=0
    while i<len(s):
        c=s[i]; cnt=0
        while i<len(s) and s[i]==c: cnt+=1; i+=1
        res+=c+(str(cnt) if cnt>1 else '')
    return res if len(res)<len(s) else s
Java
public String compress(String s){
    StringBuilder sb=new StringBuilder(); int i=0;
    while(i<s.length()){
        char c=s.charAt(i); int cnt=0;
        while(i<s.length()&&s.charAt(i)==c){cnt++;i++;}
        sb.append(c); if(cnt>1) sb.append(cnt);
    }
    String r=sb.toString();
    return r.length()<s.length()?r:s;
}

Algorithm Steps

1. Count consecutive chars
2. Compress if shorter