题目描述
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
测试样例
"aabcccccaaa"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"
首先,感谢大神指点,指出了我代码中数量大于个位数时候,索引出现的问题。
先说我初始解法主要问题:1. 修改string中的值(replace,insert,erase); 2. 修改之后对于index的调整;3. 结尾时的特殊情况考虑。
附代码:
#include <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
using namespace std;
int main()
{
string s("aabcccccccaaa");
int num = 0;
char a = ' ';
int len = s.length();
for (int i = 0, times = 0;;)
{
stringstream n;
times++;
if (times == len)
{
if (a == s[i])
{
num++;
n << num;
s.replace(i - num + 2, num - 1, n.str());
}
else
{
n << num;
s.replace(i - num + 1, num - 1, n.str());
s += "1";
}
break;
}
else
{
if (a == s[i])
{
num++;
i++;
}
else
{
if (num != 0)
{
n << num;
s.replace(i - num + 1, num - 1, n.str());
i -= num - 2;
}
num = 1;
a = s[i];
i++;
}
}
}
cout << s << endl;
system("pause");
return 0;
}
然后说大神的思路,不要在原string里做修改,直接新建一个string,醍醐灌顶。
class Zipper {
public:
string zipString(string iniString) {
// write code here
string snew("");
char a = ' ';
int num = 0;// 初始化有点问题
for (int i = 0; i < iniString.length(); i++)
{
stringstream n;
if (i == iniString.length() - 1)
{
if (iniString[i] == a)// 说明不是第一个
{
num++;
n << num;
snew += n.str();
}
else// 说明最后一个是新的元素
{
n << num;
snew += n.str() + iniString[i] + "1";
}
}
else
{
if (iniString[i] == a)
num++;
else
{
n << num;
if (num != 0)
snew += n.str() + iniString[i];
else
snew += iniString[i];
num = 1;
a = iniString[i];
}
}
}
if (snew.length() < iniString.length())
return snew;
else
return iniString;
}
};