压缩字符串
思路: 在字符重复出现的时候,例如"aabcccccaaa"
变成"a2b1c5a3"
就好,charAt就相当于头字符,last是尾字符
具体思路:
- 设定int count = 0; // 记录前一个字符的重复次数
- 设定char last = 0;// 上一个字符
- 创建一个
StringBuilder sb = new StringBuilder();
- 遍历字符串src
- 当i=0的时候,将第一个字符,
char charAt = src.charAt(0);
赋值给charAt,并且压进sb中,sb.append(charAt);
,同时count++。last = charAt;
将字符赋值给last - 当i=1的时候,
char charAt = src.charAt(1);
然后再判断是否和上一个字符一样if (last == charAt)
如果是,则count++,如果不是,则压进sb中sb.append(count).append(charAt);
且重置count=1. - 重复上述。。。。。。
- if (count >= 1) {
sb.append(count);
}
考虑最后一个字符的重复次数
/*
* 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。
* 比如,字符串"aabcccccaaa"经历压缩会变成"a2b1c5a3"。
* 若压缩后的字符串没有变短,则返回原先的字符串。
* 给定一个string iniString为待压缩的串(长度小于等于10000).
* 保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
* 测试样例
* "aabcccccaaa"
* 返回:"a2b1c5a3"
* */
public class 压缩字符串 {
public static void main(String[] args){
String res = zipString("abc");
System.out.println(res);
}
public static String zipString(String src){
int count = 0; // 记录前一个字符的重复次数
char last = 0; // 上一个字符
StringBuilder sb = new StringBuilder();
for (int i = 0; i < src.length(); i++){
char charAt = src.charAt(i);
if (sb.length() == 0) { //处理第一个字符
sb.append(charAt);
count++;
} else {
if (last == charAt) { // 和上一个字符相同
count++;
} else { // 和上一个字符相同
sb.append(count).append(charAt);
count = 1; // 重置为1
}
}
last = charAt;
}
//考虑最后一个字符的重复次数
if (count >= 1) {
sb.append(count);
}
//比较新字符串和原字符串
if (sb.length() >= src.length()) {
return src;
}
return sb.toString();
}
}