题目描述
输入一串字符,请编写一个字符串压缩程序,将字符串中连续出现的重复字母进行压缩,并输出压缩后的字符串。
例如:
aac 压缩为 1ac
xxxxyyyyyyzbbb 压缩为 3x5yz2b
思路及解答
package 小红书.字符串压缩算法;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String s = scanner.nextLine();
String res = solution(s);
System.out.println(res);
}
}
/*
* 思路:
* 1.使用滑动窗口法
* 2.定义两个指针l和r最初都指向数组的首位
* 3.如果c[r]=c[l],r就向右走
* 4.直到c[r]!=c[l],拼接字符串,长度就为r-l-1
* 5.令l=r,继续循环
* 6.如果结果为0,则不将0拼接进去
* */
public static String solution(String s){
if(s == null || s.length() == 0) return s;
char[] c = s.toCharArray();
StringBuilder sb = new StringBuilder();
int l = 0;
int r = 0;
//while循环之后没有处理最后一位
while(r < c.length){
if(c[l] == c[r]){
r++;
}else{
if((r-l-1)!=0){
sb.append(r-l-1);
}
sb.append(c[l]);
l = r;
}
}
//对最后一位的处理
int count = 0;
int p = c.length-1;
char temp = c[p];
//算出最后一位字符的出现的次数
while(p >= 0 && c[p] == temp){
count++;
p--;
}
if(count-1 != 0){
sb.append(count-1);
}
sb.append(c[c.length-1]);
String s1 = sb.toString();
return s1;
}
}