为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1321
题目内容
在进行数据传输时常使用字符串压缩算法节约资源,小 C C C发现在他传输的字符串中有很多连续的字符,他基于这一点创造了以下压缩方法:
所有相同且连续的字符串将被压缩成“连续个数+原字符”的形式,例如字符串“ A a a a B C AaaaBC AaaaBC”将被压缩为“ 1 A 3 a 1 B 1 C 1A3a1B1C 1A3a1B1C”,字符串“ 111 A B 11 111AB11 111AB11”将被压缩为“ 311 A 1 B 21 311A1B21 311A1B21”。请你帮小 C C C完成压缩程序。
输入
多组样例,第一行包含一个数字T表示样例组数。接下来每组样例占一行,保证输入字符串中只包含大小写字母、数字和空格。需要处理到输入结束( E O F EOF EOF)。
输出
对于每一组输入,输出压缩结果。
样例
输入
3
333 444
ABCD
TJU 1895
输出
331 34
4 1A1B1C1D
1T1J1U1 11181915
提示
每个样例的字符串长度不超过 10000 10000 10000,所有字符串长度总和不超过 1000000 1000000 1000000.
思路:双指针
按照题意去模拟,统计每个连续相同部分的字符的长度。
这里用一个双指针来实现, i i i 标记头字符, j j j 标记尾字符,直到 s [ j ] ≠ s [ i ] s[j]\neq s[i] s[j]=s[i] 停止。此时, s [ i ] , s [ i + 1 ] , ⋯ , s [ j − 2 ] , s [ j − 1 ] s[i],s[i+1],\cdots,s[j-2],s[j-1] s[i],s[i+1],⋯,s[j−2],s[j−1] 都是相同的。这部分相同字符的长度就是 j − i j-i j−i 。然后注意将 i i i 更新到 j j j ,这样下一次开始的就是一个新的字符了。
时间复杂度: O ( n ) O(n) O(n)
类似题目推荐
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
while (n > 0) {
string s;
// 读取一行
getline(cin, s);
// 由于缓冲区可能未被刷新,可能会有换行符等,所以此时 s 为空,过滤即可
if (s.empty()) continue;
n -= 1;
// 答案串
string ans;
for (int i = 0; i < s.size(); ++i) {
// j 从 i 开始,作为第二个指针,等 i~j-1统计完后,将 i 更新为 j 即可
// 从 s[i] 到 s[j - 1] 是所有的与 s[i] 相同的字符
int j = i + 1;
while (j < s.size() && s[j] == s[i]) {
j += 1;
}
// 统计相同字符的数量
ans += to_string(j - i);
// 记录当前的字符
ans += s[i];
// 这部分相同的已经被统计过了
i = j - 1;
}
cout << ans << "\n";
}
return 0;
}
总结
考察是否会实现计算连续相同字符的长度,简单题。
题目内容均收集自互联网,如如若此项内容侵犯了原著者的合法权益,可联系我: (CSDN网站注册用户名: 塔子哥学算法) 进行删除。