壓縮字串《演算法很美》

羅彬樺發表於2021-01-01

壓縮字串

思路: 在字元重複出現的時候,例如"aabcccccaaa"變成"a2b1c5a3"就好,charAt就相當於頭字元,last是尾字元

具體思路:

  1. 設定int count = 0; // 記錄前一個字元的重複次數
  2. 設定char last = 0;// 上一個字元
  3. 建立一個StringBuilder sb = new StringBuilder();
  4. 遍歷字串src
  5. 當i=0的時候,將第一個字元,char charAt = src.charAt(0);賦值給charAt,並且壓進sb中,sb.append(charAt);,同時count++。 last = charAt;將字元賦值給last
  6. 當i=1的時候,char charAt = src.charAt(1); 然後再判斷是否和上一個字元一樣if (last == charAt) 如果是,則count++,如果不是,則壓進sb中 sb.append(count).append(charAt);且重置count=1.
  7. 重複上述。。。。。。
  8. if (count >= 1) {
    sb.append(count);
    }
    考慮最後一個字元的重複次數
/*
 * 利用字元重複出現的次數,編寫一個方法,實現基本的字串壓縮功能。
 * 比如,字串"aabcccccaaa"經歷壓縮會變成"a2b1c5a3"。
 * 若壓縮後的字串沒有變短,則返回原先的字串。
 * 給定一個string iniString為待壓縮的串(長度小於等於10000).
 * 保證串內字元均由大小寫英文字母組成,返回一個string,為所求的壓縮後或未變化的串。
 * 測試樣例
 * "aabcccccaaa"
 * 返回:"a2b1c5a3"
 * */


public class 壓縮字串 {
   public static void main(String[] args){
       String res = zipString("abc");
       System.out.println(res);
   }
   public static String zipString(String src){
       int count = 0; // 記錄前一個字元的重複次數
       char last = 0; // 上一個字元
       StringBuilder sb = new StringBuilder();
       for (int i = 0; i < src.length(); i++){
           char charAt = src.charAt(i);
           if (sb.length() == 0) { //處理第一個字元
               sb.append(charAt);
               count++;
           } else {
               if (last == charAt) { // 和上一個字元相同
                   count++;
               } else {              // 和上一個字元相同
                   sb.append(count).append(charAt);
                   count = 1;        // 重置為1
               }
           }
           last = charAt;
       }
       //考慮最後一個字元的重複次數
       if (count >= 1) {
           sb.append(count);
       }
       //比較新字串和原字串
       if (sb.length() >= src.length()) {
           return src;
       }
       return sb.toString();
   }

}

相關文章