基本字符串压缩
- 参与人数:1661时间限制:3秒空间限制:32768K
- 通过比例:15.52%
- 最佳记录:0 ms|0K(来自 牛客游客)
题目描述
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
测试样例
"aabcccccaaa"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"
题意很简单但要理解透彻,我一开始就想错了,,,看测试数据有时候还是挺管用的;
这题主要是string的操作,主要是数字转字符串的操作,类似于java中的to_string()操作,我模拟了下。可能不是最优解。但复杂度是O(n) 应该可以接受
#include<stdio.h>
#include<string>
using namespace std;
class Zipper {
public:
string zipString(string iniString) {
// write code here
string st="";
if(iniString.size()==0) return st;
st+=iniString[0];
int cnt=1;
for(int i=1;i<iniString.size();i++)
{
if(iniString[i]!=iniString[i-1])
{
st+=to_string(cnt)+iniString[i];
cnt=0;
}
cnt++;
}
st+=to_string(cnt);
if(st.size()>=iniString.size()) return iniString;
else return st;
}
string to_string(int n)
{
int a[30],cnt=0;
string s="";
while(n)
{
a[cnt++]=n%10;
n/=10;
}
for(int i=cnt-1;i>=0;i--)
{
s+=('0'+a[i]);
}
return s;
}
};
int main()
{
Zipper zi;
string s="aabcccccaaa";
s=zi.zipString(s);
for(int i=0;i<s.size();i++) printf("%c",s[i]);
puts("");
string ss="welcometonowcoderrrrr";
ss=zi.zipString(ss);
for(int i=0;i<ss.size();i++) printf("%c",ss[i]);
puts("");
return 0;
}