提示
LintCode中的相关算法题实现代码,可以在我的GitHub中下载。
题目需求
设计一种方法,通过给重复字符计数来进行基本的字符串压缩。
例如,字符串 aabcccccaaa
可压缩为 a2b1c5a3
。而如果压缩后的字符数不小于原始的字符数,则返回原始的字符串。
可以假设字符串仅包括a-z的字母。
样例
str=aabcccccaaa
返回 a2b1c5a3
str=aabbcc
返回 aabbcc
str=aaaa
返回 a4
解题思路
使用一个vector和stack即可解决;使用vector将字符放入在里面,如果相同的字符,那就继续放置,如果不同就计算长度,将后将长度放入新的字符中;stack用来进行计算字符的长度。
实现代码
class Solution {
public:
/**
* @param str: a string
* @return: a compressed string
*/
string compress(string &str) {
// write your code here
vector<char> tmp;
stack<int> stacks;
string s="";
if(str.size()==0) return str;
tmp.push_back(str[0]);
if(str.size()==1)
{
s.push_back(tmp[0]);
return s;
}
for(int i=1;i<str.size();i++)
{
if(str[i]==tmp[0])
{
tmp.push_back(str[i]);
}
else
{
s.push_back(tmp[0]);
int t=tmp.size();
while(t)
{
stacks.push(t%10);
t/=10;
}
if(t!=0) stacks.push(t);
while(stacks.size())
{
s.push_back(stacks.top()+'0');
stacks.pop();
}
tmp.clear();
tmp.push_back(str[i]);
}
}
s.push_back(tmp[0]);
int t=tmp.size();
while(t)
{
stacks.push(t%10);
t/=10;
}
if(t!=0) stacks.push(t);
while(stacks.size())
{
s.push_back(stacks.top()+'0');
stacks.pop();
}
if(s.size()>=str.size()) return str;
return s;
}
};