题目难度:一星
考察点:字符串、模拟
方法:模拟
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; }