【LeetCode刷题记录】13.字符串压缩

157 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-字符串压缩

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

示例1:

输入:"aabcccccaaa"

输出:"a2b1c5a3"

示例2:

输入:"abbccd"

输出:"abbccd"

解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

提示:

字符串长度在[0, 50000]范围内。

二、思路分析:

大体思路:字符串压缩的方式就是将连续出现的相同字符按照 字符 + 出现次数 压缩。如果压缩后的字符串长度变短,则返回压缩后的字符串,否则保留原来的字符串,所以我们模拟这个过程构建字符串即可。

  1. 从左往右遍历字符串,用 ch 记录当前要压缩的字符,cnt 记录 ch 出现的次数,如果当前遍历到的字符等于ch,则更新cnt的计数,若不等于,则将ch预计cnt拼接到答案字符串中,即 answer = answer + ch + cnt
  2. 更新ch为下一个字符,再进行相同的判断
  3. 遍历结束后,将answer与原字符串进行比较,若相等则返回原字符串,若不相等则返回压缩字符串

三、AC 代码:

class Solution {
    public String compressString(String s) {
        if (s.length() == 0) {
            return s;
        }
        StringBuffer answer = new StringBuffer();
        int cnt = 1;
        char ch = s.charAt(0);
        for (int i = 1; i < s.length(); ++i) {
            if (ch == s.charAt(i)) {
                cnt++;
            } else {
                answer.append(ch);
                answer.append(cnt);
                ch = s.charAt(i);
                cnt = 1;
            }
        }
        answer.append(ch);
        answer.append(cnt);
        return answer.equals(s) ? s : answer.toString();
    }
}

时间复杂度:O(n)。

四、总结:

  1. 对于这种需要计数的,后面的处理结果不影响前面的处理结果的,双指针一直都是首选。
  2. 拼接字符串使用StringBuffer