categories: [Blog,Algorithm]


面试题 01.06. 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

输入:”aabcccccaaa”
输出:”a2b1c5a3”
示例2:

输入:”abbccd”
输出:”abbccd”
解释:”abbccd”压缩后为”a1b2c2d1”,比原字符串长度更长。
直接统计

  1. class Solution {
  2. public String compressString(String S) {
  3. if (S.length() == 0) { // 空串处理
  4. return S;
  5. }
  6. StringBuffer ans = new StringBuffer();
  7. int cnt = 1;
  8. char ch = S.charAt(0);
  9. for (int i = 1; i < S.length(); ++i) {
  10. if (ch == S.charAt(i)) {
  11. cnt++;
  12. } else {
  13. ans.append(ch);
  14. ans.append(cnt);
  15. ch = S.charAt(i);
  16. cnt = 1;
  17. }
  18. }
  19. ans.append(ch);//最后一个还没添加呢
  20. ans.append(cnt);
  21. return ans.length() >= S.length() ? S : ans.toString();
  22. }
  23. // 作者:LeetCode-Solution
  24. // 链接:https://leetcode-cn.com/problems/compress-string-lcci/solution/zi-fu-chuan-ya-suo-by-leetcode-solution/
  25. }

双指针法

  1. class Solution {
  2. public String compressString(String S) {
  3. int N = S.length();
  4. int i = 0;
  5. StringBuilder sb = new StringBuilder();
  6. while (i < N) {
  7. int j = i;
  8. while (j < N && S.charAt(j) == S.charAt(i)) {
  9. j++;//第一次i=0,j=0也会执行
  10. }
  11. sb.append(S.charAt(i));
  12. sb.append(j - i);
  13. i = j;
  14. }
  15. String res = sb.toString();
  16. if (res.length() < S.length()) {
  17. return res;
  18. } else {
  19. return S;
  20. }
  21. }
  22. // 作者:nettee
  23. // 链接:https://leetcode-cn.com/problems/compress-string-lcci/solution/shuang-zhi-zhen-fa-qu-lian-xu-zi-fu-cpython-by-net/
  24. }