题目说明: 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
/**
* 基本字符串压缩
*/
public static void zipString(String iniString) {
if(iniString == null || iniString.length()==0) {
return;
}
String zipStr = "";
char[] array = iniString.toCharArray();// 11
// System.out.println(array.length);
int count = 1;
int k = 0;
for (int j = k; j < array.length - 1; j++) {
k++;
if (array[j] == array[j + 1]) {
count++;
} else if (j != 0 && (array[j - 1] == array[j])) {
zipStr = zipStr + array[k - 1] + count;
count = 1;
}
if (j != 0 &&(array[j-1] != array[j])
&& (array[j] != array[j + 1])
) {
count = 1;
zipStr = zipStr + array[k-1] + count;
continue;
}
if (j == array.length - 2) {
zipStr = zipStr + array[k] + count;
}
}
// System.out.println(zipStr);
if (zipStr.length() >= iniString.length()) {
System.out.println(iniString);
} else {
System.out.println(zipStr);
}
}
/**
网友的高效解法
*/
public static String zipStr(String iniString){
if(iniString == null || iniString.length()==0) {
return null;
}
StringBuilder sb = new StringBuilder();
int len = iniString.length();
for(int i=0;i<len;i++) {
int count = 1;
while((i+1)<len && iniString.charAt(i) == iniString.charAt(i+1)){
count++;
i++;
}
if(count>=1){
sb.append(iniString.charAt(i));
sb.append(count);
}else{
sb.append(iniString.charAt(i));
}
}
if(sb.length() < iniString.length()){
return sb.toString();
}
return iniString;
}