【多次过】Lintcode 213:字符串压缩

设计一种方法,通过给重复字符计数来进行基本的字符串压缩。

例如,字符串 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;
    }
};

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/80658135
今日推荐