原题网址:https://www.lintcode.com/problem/string-compression/description
描述
设计一种方法,通过给重复字符计数来进行基本的字符串压缩。
例如,字符串 aabcccccaaa
可压缩为 a2b1c5a3
。而如果压缩后的字符数不小于原始的字符数,则返回原始的字符串。
可以假设字符串仅包括a-z的字母。
您在真实的面试中是否遇到过这个题?
样例
str=aabcccccaaa
返回 a2b1c5a3
str=aabbcc
返回 aabbcc
str=aaaa
返回 a4
标签
字符串处理
思路:设置一个字符标志,初始为str【0】,计数器为1,result为空串。下标从1开始遍历字符串,如果str【i】等于字符标志,计数器加1;否则将标志字符与计数器转成字符串,连接在result后面。同时,更新标志字符与计数器。
尤其注意尾部字符的处理,在循环外面增加语句块,将最后的字符(重复或者非重复)连接在result后面。
AC代码:
class Solution {
public:
/**
* @param str: a string
* @return: a compressed string
*/
string compress(string &str) {
// write your code here
int n=str.size();
if (n==0)
{
return str;
}
string result="";
char ch=str[0];
int count=1;
for (int i=1;i<n;i++)
{
if (str[i]==ch)
{
count++;
}
else
{
string st;
int2str(count,st);
result=result+ch+st;
ch=str[i];
count=1;
}
}
//不要忘记遍历到最后一个字符的情况;
string st;
int2str(count,st);
result=result+ch+st;
if (result.size()>=n)
{
return str;
}
return result;
}
void int2str(const int &int_tmp,string &string_tmp)
{
stringstream s;
s<<int_tmp;
string_tmp=s.str();//或者 s>>string_tmp;
}
};