题目描述
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)
示例
算法代码
package zifuchuan.demo;
// 力扣 字符串题目 字符串的压缩
public class Domn {
public void compressString(String S){
int N = S.length();
int i = 0;
StringBuilder res = new StringBuilder();
while(i < N ){
int j = i;
//charAt()方法返回指定索引位置的字符
while( j < N && S.charAt(i) == S.charAt(j)){
j++;
}
//向字符串生成器中追加内容
res.append(S.charAt(i));
res.append(j-i);
i = j;
}
String sb = res.toString();
if(sb.length() <N){
//return sb; 使用return时应该将上述方法函数中的 void 替换为String
System.out.println(sb);
}else{
//return S;
System.out.println(S);
}
}
public static void main(String[] args){
String S = new String("aabcccccaaa");
Domn fgdj = new Domn();
fgdj.compressString(S);
}
}
思路总结
方法:双指针
1、这一题的核心思路主要是首先统计出字符串中连续的字符的个数,然后将这个连续字符和该字符个数连接在一起,统计完所有的字母后输出新的字符串。
2、代码步骤,首先实例化一个字符串生成器对象, 将第一指针 i 赋初值0,表示将指针 i 放在索引为 0 的位置, 利用while外循环来实现整个过程,将第二个指针的起始位置也放在索引为 0 的位置,再执行while内循环,内循环的判断条件是,第二个指针索引的位置要小于要进行压缩的字符串S的长度,,同时还需要满足的就是两个指针对应位置的字符是否相等,上述两个条件均满足的就移动第二个指针 j ,直到跳出该while内循环。
3、将此时第一个指针 i 对应的字符追加到StringBuilder类实例化的res对象中,然后将第二个指针与第一个指针的差值追加到res对象中,最后将 j 指针索引位置的字符赋给 i ,再将res转变成字符串对象。
4、最后加上一个判断条件,当新生成的字符串的长度小于字符串S,则返回 res。当新生成的字符串长度大于S时,则返回原字符串S。