1.题目解析
本题的目的是遍历一个字符串,将重复的字符串以该字符+出现次数进行压缩,最终返回压缩后的字符串即可
题目来源:面试题01.06.字符串压缩
2.算法原理
我们从左往右遍历字符串,用 ch 记录当前要压缩的字符,cnt 记录 ch 出现的次数,如果当前枚举到的字符 s[i] 等于 ch ,我们就更新 cnt 的计数,即 cnt = cnt + 1,否则我们按题目要求将 ch 以及 cnt 更新到答案字符串 ans 里,即 ans = ans + ch + cnt,完成对 ch 字符的压缩
随后更新 ch 为 s[i],cnt 为 1,表示将压缩的字符更改为 s[i]
在遍历结束之后,我们就得到了压缩后的字符串 ans,并将其长度与原串长度进行比较。如果长度没有变短,则返回原串,否则返回压缩后的字符串
3.代码展示
class Solution {
public:
string compressString(string S) {
if ((int)S.length() == 0) return S; // 空串处理
string ans = "";
int cnt = 1;
char ch = S[0];
for (int i = 1; i < (int)S.length(); ++i){
if (ch == S[i]) cnt++;
else{
ans += ch + to_string(cnt); // 注意 cnt 要转为字符串
ch = S[i];
cnt = 1;
}
}
ans += ch + to_string(cnt);
return ans.length() >= S.length() ? S : ans;
}
};