题目说明:

    利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“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;

}