Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-字符串压缩
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
二、思路分析:
大体思路:字符串压缩的方式就是将连续出现的相同字符按照 字符 + 出现次数 压缩。如果压缩后的字符串长度变短,则返回压缩后的字符串,否则保留原来的字符串,所以我们模拟这个过程构建字符串即可。
- 从左往右遍历字符串,用 ch 记录当前要压缩的字符,cnt 记录 ch 出现的次数,如果当前遍历到的字符等于ch,则更新cnt的计数,若不等于,则将ch预计cnt拼接到答案字符串中,即 answer = answer + ch + cnt
- 更新ch为下一个字符,再进行相同的判断
- 遍历结束后,将answer与原字符串进行比较,若相等则返回原字符串,若不相等则返回压缩字符串
三、AC 代码:
class Solution {
public String compressString(String s) {
if (s.length() == 0) {
return s;
}
StringBuffer answer = new StringBuffer();
int cnt = 1;
char ch = s.charAt(0);
for (int i = 1; i < s.length(); ++i) {
if (ch == s.charAt(i)) {
cnt++;
} else {
answer.append(ch);
answer.append(cnt);
ch = s.charAt(i);
cnt = 1;
}
}
answer.append(ch);
answer.append(cnt);
return answer.equals(s) ? s : answer.toString();
}
}
时间复杂度:O(n)。
四、总结:
- 对于这种需要计数的,后面的处理结果不影响前面的处理结果的,双指针一直都是首选。
- 拼接字符串使用StringBuffer