题目描述:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:“aabcccccaaa”
输出:“a2b1c5a3”
示例2:
输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。
解题思路:由于这个题考虑的是压缩在一起的连续字符,我们自然可以用到StringBuilder或者StringBuffer 这个可增长的字符串的处理,并且由于这里没涉及到线程安全问题采用效率更高的StringBuilder。
将字符串转换成字符数组之后,去遍历的过程中只要第 i 个和第 i + 1个字符不相等那就可以直接拼接第i个字符及其连续的个数,直到遍历完整个字符数组。同时,我们还要锁定一个下标index,依次来决定最后一个字符的输出形式
当然在最后判断result的长度和字符串S的长度来决定输出哪一个
class Solution { public String compressString(String S) { //为0返回空字符串 if(S.length() == 0){ return ""; } StringBuilder sb = new StringBuilder(); char []chars = S.toCharArray(); int count = 0; int index = 0; //遍历整个chars数组 for(int i = 0;i < chars.length - 1;i++){ count++; if(chars[i] != chars[i+1]){ //直接跟上此时统计的字符和对应的数字 sb.append(chars[i]).append(count); //重新开始,count置为0 count = 0; //index为i+1 index = i+1; } } //字符的最后一个 sb.append(chars[index]).append(chars.length - index); //转换成字符串形式的 String result = sb.toString(); return result.length() < S.length() ? result : S; } }