題目
題目鏈接
字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串aabcccccaaa會變爲a2b1c5a3。若“壓縮”後的字符串沒有變短,則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母(a至z)。
示例1:
輸入:"aabcccccaaa"
輸出:"a2b1c5a3"
示例2:
輸入:"abbccd"
輸出:"abbccd"
解釋:"abbccd"壓縮後爲"a1b2c2d1",比原字符串長度更長。
提示:
字符串長度在[0, 50000]範圍內。
解題思路
雙指針的典型習題。具體看註釋。
具體看圖(圖片源自題解)
代碼
class Solution {
public String compressString(String S) {
//防止給定S 爲空 造成的indexout
if(S.length()==0){
return S;
}
//處理後的字符串
String solve = solve(S);
//如果處理後的字符串長度大於等於未處理的字符串長度 等於沒優化 返回原來的字符串
if(solve.length()>=S.length()){
return S;
}
return solve;
}
public static String solve(String S) {
StringBuilder sb = new StringBuilder();
//i j 雙指針 j 快 i 慢
int i, j;
i = j = 0;
char[] chars = S.toCharArray();
//循環結束條件 當 i > j時 並且 j > 原來字符串的長度
//當j <= S.length()時 j超出數組範圍ArrayIndexOutOfBoundsException 所以下方需要內部強制終止
while (i <= j && j <= S.length()) {
//如果快慢指針對應的字符相等 快指針前進一步 j < S.length() 避免ArrayIndexOutOfBoundsException
if (j < S.length() && chars[i] == chars[j]) {
j++;
} else {
//j-i表示重複的個數
sb.append(chars[i]).append(String.valueOf(j - i));
i = j;
}
//當ArrayIndexOutOfBoundsException時內部循環強制終止
if (i >= S.length()) {
break;
}
}
return sb.toString();
}
}