地址: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;
}
};