LeetCode No. 面试题01.06 字符串压缩

584 阅读1分钟

原题链接

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

示例1:

输入:"aabcccccaaa"
输出:"a2b1c5a3"

提示:

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

模拟

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

我们从左往右遍历字符串,用 value 记录当前要压缩的字符,num 记录 value 出现的次数,如果当前枚举到的字符 array[i] 等于 value ,我们就更新 num 的计数,即 num = num + 1,否则我们按题目要求将 value 以及 num 更新到答案字符串 r 里,即 r = r + value + num,完成对 value 字符的压缩。随后更新 value 为 array[i],num 为 1,表示将压缩的字符更改为 array[i]。

在遍历结束之后,我们就得到了压缩后的字符串 r,并将其长度与原串长度进行比较。如果长度没有变短,则返回原串,否则返回压缩后的字符串。

    public String compressString(String S) {
        if (S.length() == 0) return "";
        
        char[] array = S.toCharArray();
        int num = 1;
        char value = array[0];
        String r = "";
        for(int i=1;i<array.length;i++) {
            if(value == array[i]){
                num++;
            }else{
                r += String.valueOf(value) + String.valueOf(num);
                num = 1;
                value = array[i];
            }
        }
        r += String.valueOf(value) + String.valueOf(num);
        return r.length() >= S.length() ? S : r;
    }
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)