题目:
压缩字符串。实现一个算法,利用字符重复出现的次数,实现基本的字符串压缩功能。比如,测试样例"aabcccccaaa" 返回:"a2b1c5a3"。若压缩后的字符串没有变短,则返回原先的字符串。
代码:
public class Zipper {
public static void main(String[] args) {
String res = zipString("aabcccccaaa");
System.out.println(res);
}
static String zipString(String src){
int count = 0; // 记录前一个字符的重复次数
char last = 0; // 上一个字符
StringBuilder sb = new StringBuilder();
for (int i = 0; i < src.length(); i++) {
char charAt = src.charAt(i);
if (sb.length()==0) { // 处理第一个字符
sb.append(charAt);
count++;
}else {
if (last==charAt){ // 和上一个字符相同
count++;
}else { // 和上一个字符不同
sb.append(count).append(charAt);
count = 1;
}
}
last = charAt;
}
// 考虑最后一个字符的重复次数
if (count>=1) {
sb.append(count);
}
// 比较新字符串和原字符串
if (sb.length()>= src.length()) {
System.out.println("字符串没有变短:"+sb.toString());
return "原字符串:"+src;
}
return sb.toString();
}
}
C++程序代码:
#include<iostream>
#include<algorithm>
using namespace std;
string zipString(string str)
{
int count=1;
int len=str.length();
char c=str[0];
string ans;
for(int i=1;i<len;i++)
{
char temp=str[i];
if(temp==str[i-1])
{
count++;
}
else
{
ans+=str[i-1];
ans+=char(count+'0');
count=1;
}
}
if(count>0)
{
ans+=str[len-1];
ans+=char(count+'0');
}
else
{
ans+=str[len-1];
ans+='1';
}
return ans;
}
int main()
{
string str="aacccd";
cout<<zipString(str);
return 0;
}
结果: