01.06 字符串压缩
1、题目
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
1)示例1
输入:"aabcccccaaa"
输出:"a2b1c5a3"
2)示例2
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
2、初步作答
2.1 思路
- 判断字符串是否为空,空字符串不能压缩
- 依次读取字符串,相同字符,则数量加 1
- 比较压缩的字符串与原字符串长度,若未减少则输出原字符串
2.2 做法
- 判断字符串是否为空,为空直接返回原字符串
- 创建一个二维数组,字符串长度为行数,列数为 2
- 遍历字符串,扫描到新的字符直接放入第一列
- 每次扫描到与上一行相同的字符,第二列加一
- 建立 StringBuffer 类型的字符串,插入字符形成新的字符串
- 比较字符串长度,输出长度较小的那一个
2.3 代码
public class String_compression {
public static void main(String[] args) {
String s1;
s1 = "aabbbcccaaaa";
System.out.println(s1);
s1 = compressString(s1);
System.out.println(s1);
}
public static String compressString(String S) {
if(S.isEmpty()){
return S;
}
char[] Sarr = new char[S.length()];//创建数组存储压缩字符串的数据
int[] Snum = new int[S.length()];//压缩后字符的个数
StringBuffer s =new StringBuffer();//存储压缩后的字符串
char Sc;
int l = -1;
for (int i = 0; i < S.length(); i++) {//将压缩数据存入数组Sarr中
Sc = S.charAt(i);
if(l == -1){
l++;
if(Sc != Sarr[l]){
Sarr[l] = Sc;
Snum[l] = Snum[l] + 1;
}else{
Snum[l] = Snum[l] + 1;
}
}else{
if(Sc != Sarr[l]){
l++;
Sarr[l] = Sc;
Snum[l] = Snum[l] + 1;
}else{
Snum[l] = Snum[l] + 1;
}
}
}
for (int i = 0; i < l+1; i++) {
s.append(Sarr[i]);
s.append(Snum[i]);
}
String ss = s.toString();
if(ss.length() < S.length()){
return ss;
}else{
return S;
}
}
}
执行用时:6 ms, 在所有 Java 提交中击败了28.80%的用户
内存消耗:41.3 MB, 在所有 Java 提交中击败了11.17%的用户
通过测试用例:32 / 32
3、其余解法
力扣官方代码
class Solution {
public String compressString(String S) {
if (S.length() == 0) { // 空串处理
return S;
}
StringBuffer ans = 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 {
ans.append(ch);
ans.append(cnt);
ch = S.charAt(i);
cnt = 1;
}
}
ans.append(ch);
ans.append(cnt);
return ans.length() >= S.length() ? S : ans.toString();
}
}