题目描述
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
思路:
第一种做法-双指针
定义两个指针i和j,j指针用来计字符出现的次数。
先移动j指针,遇到和i相同的字符j指针就向右自增。
遇到不同字符就把j指针的值赋值给i,返回ij指针,a3。然后按照这个方法继续遍历,最后返回的结果是a3b2c3。
class Solution {
public String compressString(String S) {
int N = S.length();//字符串的长度
int i = 0;//定义第一个指针表示字符
StringBuilder str = new StringBuilder();//定义一个可变的字符串
while (i < N) {//循环的条件是i指针小于字符串s的长度
int j = i;//定义第二个指针j指向i
while (j < N && S.charAt(j) == S.charAt(i)) {//如果两个指针相同移动j指针
j++;
}
sb.append(S.charAt(i));//把i指针的值添加到字符串中
sb.append(j - i);//在添加这个字符出现的次数
i = j;//在重新的赋值
}
String res = str.toString();//定义字符串把可变的字符串添加进去
if (res.length() < S.length()) {//res的长度小于s字符串的长度
return res;//输出res
} else {
return S;//否则输出S
}
}
}
第二种做法
使用两个变量,使用一个变量用来记录当前字符,在用一个变量用来记录字符出现的次数,当遇到新的字符的时候就把这两个变量加到结果中,然后在对着两个变量重新赋值,重复这个操作,直到把所有的字符遍历完。
class Solution {
public String compressString(String S) {
//边界条件判断
if (S == null || S.length() == 0)
return S;
StringBuilder res = new StringBuilder();//定义可变的字符串
//先把第一个字符添加到res中
res.append(S.charAt(0));
int count = 1;//次数
for (int i = 1; i < S.length(); i++) {
//判断重复字符的数量
if (S.charAt(i) == S.charAt(i - 1)) {
count++;//次数++
continue;
}
//走到这里,说明遇到了新的字符,先把前面字符
//的数量添加到res中,然后再添加这个新的字符
res.append(count).append(S.charAt(i));
count = 1;//重置次数
}
//上面的计算会遗漏最后一个字符的数量,这里加上
res.append(count);
return res.length() >= S.length() ? S : res.toString();//res的长度小于s字符串的长度,输出res,否则输出S
}
}