题干
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
想法
我两个想法
一个是用hashmap存储次数,一旦遇到不同的字符串那就清空hashmap以免之前的干扰到后边的;
遇到不同的就读hashmap把之前连续的取出来
最后比较长度
另一个用数组加一个count就行
Java代码
package daily;
import java.util.HashMap;
public class CompressString {
public String compressString(String S) {
StringBuffer stringBuffer =new StringBuffer();
int len=S.length();
//空判断
if(len==0||S.isEmpty()){
return S;
}
//字符和对应出现次数
HashMap<Character,Integer> hashMap= new HashMap<>();
char [] arr= S.toCharArray();
//首位单独处理
hashMap.put(arr[0],1);
for (int i=1;i<arr.length;i++){
if(hashMap.containsKey(arr[i])){
//连续情况
hashMap.put(arr[i],hashMap.get(arr[i])+1);
}
else {
//非连续情况就先把之前连续的放进stringbuffer
stringBuffer.append(arr[i-1]);
stringBuffer.append(hashMap.get(arr[i-1]));
hashMap.clear();
hashMap.put(arr[i],1);
}
}
//首位手动处理
if(hashMap.containsKey(arr[len-1])){
stringBuffer.append(arr[len-1]);
stringBuffer.append(hashMap.get(arr[len-1]));
}
else {
stringBuffer.append(arr[len-1]);
stringBuffer.append(1);
}
int tem=stringBuffer.length();
if(tem<len){
return stringBuffer.toString();
}
return S;
}
public static void main(String[] args){
CompressString compressString=new CompressString();
String S="bbbac";
System.out.println(compressString.compressString(S));
}
}
leetcode上更快更易懂的代码
也就是我的思路二的实现
class Solution {
public String compressString(String s) {
int len = s.length();
if (len <= 1){
return s;
}
StringBuilder sb = new StringBuilder();
char[] chars = s.toCharArray();
char chOld = chars[0],chNew=chOld;
int count = 1;
for (int i=1;i<= len-1 ;){
chNew = chars[i];
if (chOld != chNew){
sb.append(chOld);
sb.append(count);
chOld = chNew;
count = 1;
i++;
continue;
}
count++;
i++;
}
sb.append(chNew).append(count);
if (len <= sb.length()){
return s;
}
return sb.toString();
}
}