题目难度:一星
考察点:字符串、模拟


方法:模拟

1.分析:

根据题意,是要对相邻的字符进行压缩,那么我们可以直接从头开始进行遍历,如果遇到相同的,直接计数,直到遇到相邻字符不相同的,直接输出前一个字符的个数和前一个字符,即用一个记录字符个数的变量ans,初始时ans=1,然后指针i从1开始遍历,如果s[i] == s[i-1],那么ans++,否则的话输出ans和s[i-1],同时将ans再次置为1,以方便下次计数。
举个例子:
拿字符串"aaabccccdd"来说,初始化ans = 1, 字符串长度len = 10, 从i = 1开始遍历:
当i = 1时,此时s[1]==s[0],所以ans++,即ans=2
当i = 2时,此时s[2]==s[1],所以ans++,即ans=3
当i = 3时,此时s[3]!=s[2],所以输出ans=3和s[2],重新将ans置为1,即ans=1。
当i = 4时,此时s[4]!=s[3],所以输出ans=1和s[3],重新将ans置为1,即ans=1。
当i = 5时,此时s[5]==s[6],所以ans++,即ans=2
...
当i = 8时,此时s[8]!=s[7],所以输出ans=4和s[8],重新将ans置为1,即ans=1。
当i = 9时,此时s[9]==s[8],所以ans++,即ans=2.
此时遍历结束,直接输出ans=2和s[9]即可。
算法实现:
(1). 输入字符串s,并获取当前字符串s的长度len
(2). 首先判断字符串长度是不是1,如果为1直接输出1和字符串即可
(3). 按照上述算法从i=1开始遍历,一边计算相邻字符个数一边遍历,如果相邻字符相等ans++,否则cout<<ans<<s[i-1]; 重新将ans = 1;。
(4). 当遍历完字符串之后,输出ans和最后一个字符。

2.复杂度分析:

时间复杂度:O(1)
空间复杂度:O(n)

3.代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
    string s; cin>>s;
    int len = s.size();
    if(len == 1) {
        cout<<1<<s<<endl;
        return 0;
    }
    int ans = 1;
    for(int i=1; i<len; i++) {
        if(s[i] != s[i-1]) {
            cout<<ans<<s[i-1];
            ans = 1;
        }
        else ans++;
    }
    cout<<ans<<s[len-1]<<endl;
    return 0;
}