圖解LeetCode No.0106之字符串壓縮

字符串壓縮

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

示例1:

 輸入:"aabcccccaaa"
 輸出:"a2b1c5a3"
示例2:

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

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

解題思路

這是一道簡單題目,但是想bugFree的快速寫出代碼也不容易。
有幾個要點:

  1. 怎麼判斷字符已有,需要用臨時存儲嗎?臨時存儲用set,map,或者還是一個char變量。
  2. 如果儘量少的使用內存,如果你用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));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章