字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
提示:
- 字符串长度在[0, 50000]范围内。
模拟
字符串压缩的方式就是将连续出现的相同字符按照 字符 + 出现次数 压缩。如果压缩后的字符串长度变短,则返回压缩后的字符串,否则保留原来的字符串,所以我们模拟这个过程构建字符串即可。
我们从左往右遍历字符串,用 value 记录当前要压缩的字符,num 记录 value 出现的次数,如果当前枚举到的字符 array[i] 等于 value ,我们就更新 num 的计数,即 num = num + 1,否则我们按题目要求将 value 以及 num 更新到答案字符串 r 里,即 r = r + value + num,完成对 value 字符的压缩。随后更新 value 为 array[i],num 为 1,表示将压缩的字符更改为 array[i]。
在遍历结束之后,我们就得到了压缩后的字符串 r,并将其长度与原串长度进行比较。如果长度没有变短,则返回原串,否则返回压缩后的字符串。
public String compressString(String S) {
if (S.length() == 0) return "";
char[] array = S.toCharArray();
int num = 1;
char value = array[0];
String r = "";
for(int i=1;i<array.length;i++) {
if(value == array[i]){
num++;
}else{
r += String.valueOf(value) + String.valueOf(num);
num = 1;
value = array[i];
}
}
r += String.valueOf(value) + String.valueOf(num);
return r.length() >= S.length() ? S : r;
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)