leetcode中等443压缩字符串 / 面试题01.06

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等443压缩字符串 / 面试题01.06相关的知识,希望对你有一定的参考价值。

443、压缩字符串

给你一个字符数组 chars ,请使用下述算法压缩:
从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :

  • 如果这一组长度为 1 ,则将字符追加到 s 中。
  • 否则,需要向 s 追加字符,后跟这一组的长度。
    压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。

请在 修改完输入数组后 ,返回该数组的新长度。

你必须设计并实现一个只使用常量额外空间的算法来解决此问题。

示例 1:
输入:chars = [“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
输出:返回 4 ,输入数组的前 4 个字符应该是:[“a”,“b”,“1”,“2”]。
解释:由于字符 “a” 不重复,所以不会被压缩。“bbbbbbbbbbbb” 被 “b12” 替代。

思路:原地返回
类似 26. 删除排序数组中的重复项【简单】

  • 每次当读指针 read 移动到某一段连续相同子串的最右侧(read 指向的字符不同于下一个字符时),我们就在写指针 write 处依次写入该子串对应的字符和子串长度即可。
  • 该子串对应的字符即为读指针read 指向的字符串。我们使用变量 left 记录该子串的最左侧的位置,这样子串长度即为 read−left+1
class Solution 
    public int compress(char[] chars) 
        int n = chars.length;
        int write = 0, left = 0;
        for (int read = 0; read < n; read++) 
            if (read == n - 1 || chars[read] != chars[read + 1]) 
                chars[write++] = chars[read];
                int num = read - left + 1;
                if (num > 1) //num取余,倒序写入chars,之后还要反转
                    int anchar = write;
                    while (num > 0) 
                        chars[write++] = (char) (num % 10 + '0');
                        num /= 10;
                    
                    reverse(chars, anchar, write - 1);
                
                left = read + 1;
            
        
        return write;
    

    public void reverse(char[] chars, int left, int right) 
        while (left < right) 
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        
    


面试题01.06

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

示例1:

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

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

思路:双指针,fast 一直后移,直到和 slow 不相同了,把slow处的字符存到结果里,长度就是slow和fast之间的距离

class Solution 
    public String compressString(String S) 
        if(S.length()==0) return S;
        char[]chars=S.toCharArray();
        StringBuilder sb = new StringBuilder();
        int slow = 0, fast = 0;
        while(fast<=chars.length)
            if(fast==chars.length) sb.append(chars[slow]).append(fast-slow);
            else if(chars[fast]!=chars[slow])
                sb.append(chars[slow]).append(fast-slow);
                slow=fast;
            
            fast++;
        
        return sb.length()<chars.length?sb.toString():S;
    

以上是关于leetcode中等443压缩字符串 / 面试题01.06的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode | 面试题 01.06. 字符串压缩Python

LeetCode443-压缩字符串(双索引)

[LeetCode]面试题 01.06. 字符串压缩

[LeetCode]面试题 01.06. 字符串压缩

⭐算法入门⭐《二分枚举》中等02 —— LeetCode 面试题 10.09. 排序矩阵查找

⭐算法入门⭐《堆》中等01 —— LeetCode 面试题 17.09. 第 k 个数