题目要求以及示例:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:以下标i循环对S进行遍历,用下标j搜寻在i之后的与i元素相同的个数。搜寻完毕后,将i置为j的下一位,即与当前i元素不同的元素下标。
class Solution {
public:
string compressString(string S) {
//vector<int> ans;
string an;
for(int i=0;i<S.length();i++)
{
int a=S[i];
int count=0; //与S[i]相同元素的个数
int j=i;
while(j<S.length()&&S[j]==S[i])
{
count++;
j++;
}
if(j<=S.length()) i=j-1; //设置i,确保i++后为与当前i元素不同的下标值
an+=S[i]; //需要注意的地方
an+=to_string(count);
}
return an.length()<S.length()?an:S;
}
};
积累一下:an+=S[i]与an=an+S[I]的区别:前者是直接在an 后面添加字符串;后者是用一个临时对象计算 an + S[i]
,会消耗很多时间和内存。