设计一种方法,通过给重复字符计数来进行基本的字符串压缩。
例如,字符串 aabcccccaaa
可压缩为 a2b1c5a3
。而如果压缩后的字符数不小于原始的字符数,则返回原始的字符串。
可以假设字符串仅包括a-z的字母。
样例
str=aabcccccaaa
返回 a2b1c5a3
str=aabbcc
返回 aabbcc
str=aaaa
返回 a4
解题思路:
一开始考虑到使用unordered_map<char,int>来统计字符与其出现的个数,后来发现存进顺序被打乱,而且同一字符在不同位置的统计也被统一在一起了,不符合题目要求。
那么双指针就是不二之选啦。既然双指针,其中一个指针指向重复字符串的第一个,然后另一个指针向后遍历并计数,就能得到重复的个数。具体来看代码,我们用i和j表示双指针,开始循环后,我们用j来找重复的字符串的个数,用一个while循环,最终j指向的是第一个和i指向字符不同的地方,此时(j-i)的值为i所指向字母的重复次数,所以将str[i]与(j-i)依次存进新string中,注意每次需要将i赋值为j,从而开始下一个字符的统计,参见代码如下:
class Solution { public: /** * @param str: a string * @return: a compressed string */ string compress(string &str) { // write your code here string res; for(int i=0,j=0;i<str.size();i=j) { while(str[i]==str[j] && j<str.size()) j++; res += str[i]; res += to_string(j-i); } if(res.size() < str.size()) return res; else return str; } };