字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
自己解
string compressString(string S) {
string str;
// S += ' ';
int i = 0;
int j = 0;
while(i < S.size())
{
if(S[i] != S[i+1])
{
str += S[j];
stringstream ss;
ss << i - j + 1;
str += ss.str();
j = ++i;
continue;
}
i++;
}
if(str.size() < S.size())
return str;
return S;
}
金典解
#include<iostream>
#include<string>
#include<sstream>
#include "Question1_5.h"
using namespace std;
int Question1_5::stringToInt(const string& value)
{
int temp;
stringstream(value) >> temp;
return temp;
}
string Question1_5::intToString(int value)
{
string temp;
stringstream convert;
convert << value;
temp = convert.str();
return temp;
}
int Question1_5::countCompression(const string& str)
{
if (str.length() == 0)
{
return 0;
}
char last = str.at(0);
int size = 0;
int count = 1;
for (int i = 1; i < str.length(); i++)
{
if (str.at(i) == last)
{
count++;
}
else
{
last = str.at(i);
size = size + 1 + intToString(count).length();
count = 1;
}
}
size = size + 1 + intToString(count).length();
return size;
}
string Question1_5::compressBetter(const string& str)
{
int size = countCompression(str);
if(size >= str.length())
{
return str;
}
string newstr;
char last = str.at(0);
int count = 1;
for (int i = 1; i < str.length(); i++)
{
if (str.at(i) == last)
{
count++;
}
else
{
newstr += last;
newstr.append(intToString(count));
last = str.at(i);
count = 1;
}
}
newstr += last;
newstr.append(intToString(count));
return newstr;
}
int Question1_5::run()
{
string str = "abbccccccde";
string newstr = compressBetter(str);
cout << "Original string is " << str << endl;
cout << "Compressed string is " << newstr << endl;
return 0;
}