#include<iostream>
#include<string>
#include<map>
using namespace std;
int main(){
string s="aaaaaaaaaaddbbbbbcde";
int fast=0,slow=0,mid=0,count=0;//利用三个指针,slow用来往前放数字,mid用来做滑动窗口的起始,fast用来做滑动窗口的结尾
while(fast<s.size()){
while(s[mid]==s[fast]){//碰到相等的字符的话
count++;//计数加一
fast++;//结尾往后移动
}//不等于的时候跳出循环,这是fast指向的是下一个
if(count>1){//如果计数大于一说明有重复
slow++;//使slow指向下一位(表示有多少个数字的那位)
if(count>9){//不是个位数的话
string number = to_string(count);
for(int i =0;i<number.size();i++){
s[slow]=number[i];
slow++;
}
slow--;//使得他返回上一个位置,以便后面的操作
}else{
s[slow]='0'+count;//个位数
}
}
s[++slow]=s[fast];//假如上个字母只有一位或者已经操作完之后,slow需要加一位指向一个新的地方存放当前fast来的数据
mid=fast;//把窗口收窄到fast
count=0;//计数重置一下
}
cout<<s;
return 0;
}
c++原地压缩字符串(代码中有原理解析)
最新推荐文章于 2024-03-18 23:24:15 发布