题目
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能,“aabccccaaa”变成“a2b3c4a3”。如果压缩后字符串长度没有变短,则返回原型的字符
算法(c++)
https://github.com/zhoulike/algorithms/blob/master/cc150/1.5.cpp
算法
https://www.snip2code.com/Snippet/253088/CC150-1-5-Compress-String
复杂度:O(N),
/*import java.util.*;
class Solution{
public static void main(String[] args)
}*/
import java.util.*;
class Solution{
public static String compress(String str){
//检查压缩后字符串是否会变长
int size=countCompression(str);
if(size>=str.length())
return str;
StringBuilder mystr=new StringBuilder();
char last=str.charAt(0);
int count=1;
for(int i=1;i<str.length();i++){
if(str.charAt(i)==last) //找到重复字符
{
count++;
}else//插入字符数目,更新last字符
{
mystr.append(last);
mystr.append(count);
last=str.charAt(i);
count=1;
}
}
//需要单独处理尾部的字符串
System.out.println("last:"+last);
System.out.println("count:"+count);
mystr.append(last);
mystr.append(count);
return mystr.toString();
}
public static int countCompression(String str){
if(str==null || str.length()==0)
return 0;
char last=str.charAt(0);
int size=0;
int count=1;
for(int i=1;i<str.length();i++){
if(str.charAt(i)==last)
count++;
else{
last=str.charAt(i);
size+=1+String.valueOf(count).length();
count=1;
}
}
size+=1+String.valueOf(count).length();
return size;
}
public static void main(String[] args){
String str_test="aabcccccaaa";
String str_res=compress(str_test);
System.out.print(str_res);
}
}