字符串壓縮
字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串aabcccccaaa會變爲a2b1c5a3。若“壓縮”後的字符串沒有變短,則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母(a至z)。
示例1:
輸入:"aabcccccaaa"
輸出:"a2b1c5a3"
示例2:
輸入:"abbccd"
輸出:"abbccd"
解釋:"abbccd"壓縮後爲"a1b2c2d1",比原字符串長度更長。
提示:
字符串長度在[0, 50000]範圍內。
解題思路
這是一道簡單題目,但是想bugFree的快速寫出代碼也不容易。
有幾個要點:
- 怎麼判斷字符已有,需要用臨時存儲嗎?臨時存儲用set,map,或者還是一個char變量。
- 如果儘量少的使用內存,如果你用str+="",不斷的去做string的加法,那每次都會產生一個新的String對象。會使用的內存比較多。
圖解說明
幾個關鍵地方:
- 使用臨時變量ch,使用StringBuilder臨時變量,而不是final類型的String變量。
- for循環從i=1開始,效率更高,循環結束之後,將臨時字符及個數存儲。
- 是否需要壓縮,需要將壓縮後字符與原字符長度進行比較
代碼
public class Solution0106 {
public String compressString(String str) {
if (str == null || str.length() <= 1) {
return str;
}
StringBuilder sb = new StringBuilder();
char ch = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == ch) {
count++;
} else {
sb.append(ch).append(count);
ch = str.charAt(i);
count = 1;
}
}
sb.append(ch).append(count);
if (sb.toString().length() < str.length()) {
return sb.toString();
} else {
return str;
}
}
public static void main(String[] args) {
String str = "aabcccccaaa";
System.out.println(new Solution0106().compressString(str));
}
}