天津大学-23年夏令营上机测试--第1题-字符串压缩

为了更好的阅读体检,可以查看我的算法学习网
在线评测链接: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[j2],s[j1] 都是相同的。这部分相同字符的长度就是 j − i j-i ji 。然后注意将 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网站注册用户名: 塔子哥学算法) 进行删除。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值