【Leetcode】443. 压缩字符串

地址:443. 压缩字符串

题目

省流:压缩给定的字符数组,比如[a,a,b,b,b]就压缩为[a,2,b,3],但是当某种字母仅有1个时后面不跟数字,最后返回这个压缩的新数组的长度(注意:需要转存到原数组里)

示例

输入:chars = ["a","a","b","b","c","c","c"]
输出:返回 6 ,输入数组的前 6 个字符应该是:["a","2","b","2","c","3"]
解释:"aa" 被 "a2" 替代。"bb" 被 "b2" 替代。"ccc" 被 "c3" 替代。

思路

这里最先想到的方法那必然是双指针了

  • 利用双指针分别标记读和写的位置,当读指针一旦移到重复字母的最后一个位置时,则利用写指针记录下该字符和对应的长度
  • 用left记录子串最左侧的位置,right记录子串的最右侧位置,那么该字符重复的长度为right - left + 1
  • 为了使空间复杂度为O(1),需要使用短除法来存储子串的每一位入字符数组,然后反转即可(因为短除法从低位往高位读取

代码

class Solution {
public:
    int compress(vector<char>& chars) {
        //双指针
        int write = 0,left = 0;
        int len = chars.size();
        if(len <= 1)
            return len;
        for(int read=0;read<len;++read){
            if(read == len-1 || chars[read] != chars[read+1]){
                //一旦指向最后一个位置或者前后字符不一致
                chars[write++] = chars[read];    //记录字符
                int num = read - left + 1;
                if(num > 1){
                    int id = write;  //记录下一会儿需要开始反转的位置
                    while(num){
                        chars[write++] = num % 10 + '0'; //这是将数组转化为字符的方法
                        num /= 10;
                    }
                    reverse(&chars[id],&chars[write]);
                }
                //left就是求长度的工具人
                left = read + 1;
            }
        }
        return write;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值