c++原地压缩字符串(代码中有原理解析)

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值