题目:利用字符重复的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa"会变为"a2b1c5a3"。若压缩后的字符串没有变短,则返回原先的字符串。
这道题主要考虑的是字符串的拼接效率问题,但是C++中的拼接效率似乎与java中并不一致,关于拼接的效率,可以参考博客:
c++拼接字符串效率比较(+=、append、stringstream、sprintf)
//stringstream头文件<sstream>
string CompressString(string& str)
{
string result = "";
char curr = str[0];
int count = 1;
for(size_t i = 1; i < str.size(); ++i)
{
if(str[i] == curr)
++count;
else
{
//int转string
stringstream ss;
string s;
ss << count;
ss >> s;
result += curr + s;
curr = str[i];
count = 1;
}
}
stringstream ss;
string s;
ss << count;
ss >> s;
result += curr + s;
return result;
}
数组实现版本:
string Int2String(int digit)
{
stringstream ss;
string s;
ss << digit;
ss >> s;
return s;
}
int CountCompressionSize(string& str)
{
int count = 1;
int size = 0;
char curr = str[0];
for(size_t i = 1; i < str.size(); ++i)
{
if(str[i] == curr)
++count;
else
{
size += 1 + Int2String(count).size();
curr = str[i];
count = 1;
}
}
return size + 1 + Int2String(count).size();
}
void SetChar(char* str, char c, int& id, int count)
{
str[id++] = c;
string s = Int2String(count);
for(size_t i = 0; i < s.size(); ++i, ++id)
{
str[id] = s[i];
}
}
string CompressString(string& str)
{
string s;
size_t size = CountCompressionSize(str);
if(size == str.size())
return str;
char *result = new char[size+1];
result[size] = '\0';
char curr = str[0];
int count = 1;
int id2 = 0;
for(size_t id1 = 1; id1 < str.size(); ++id1)
{
if(str[id1] == curr)
++count;
else
{
SetChar(result, curr, id2, count);
curr = str[id1];
count = 1;
}
}
SetChar(result, curr, id2, count);
s = result;
delete[] result;
return s;
}
另外string支持append(追加string)和push_back(追加单个字符),也可以使代码简化。