【面試題 01 06】字符串壓縮

題目

題目鏈接
字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串aabcccccaaa會變爲a2b1c5a3。若“壓縮”後的字符串沒有變短,則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母(a至z)。

示例1:

 輸入:"aabcccccaaa"
 輸出:"a2b1c5a3"

示例2:

 輸入:"abbccd"
 輸出:"abbccd"
 解釋:"abbccd"壓縮後爲"a1b2c2d1",比原字符串長度更長。

提示:
字符串長度在[0, 50000]範圍內。

解題思路

雙指針的典型習題。具體看註釋。
具體看圖(圖片源自題解)
1

代碼

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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章