力扣2182.构造限制重复的字符串

发布时间:2024年01月13日

?思路:先记录每个字符的出现次数,构建一个新字符串,从尾取字符,每取一个该字符个数-1,若该字符已经取到有repeatLimit个,则递归取次大的字符,并对应字符个数-1,若没有次大字符了,则直接返回

代码:

class Solution {
public:

    bool lastchar(string &s, vector<int>& alphabet, int i){    //递归找次大字符
        if(--i == -1) return false;    //没有返回false
        if(alphabet[i] != 0){    
            alphabet[i]--;    //找到了对应字符个数-1
            s += i + 'a';    //取出字符
            return true;    //有返回true
        }
        return lastchar(s, alphabet, i);
    }

    string repeatLimitedString(string s, int repeatLimit) {
        vector<int> alphabet(26);    //记录每个字母个数
        for(auto letter : s)    //记录
            alphabet[letter - 'a']++;

        string newstr = "";    //存储结果
        for(int i = 25; i >= 0; --i){
            if(alphabet[i] != 0){
                int count = 0;    //记录当前字符取了几个了
                while(alphabet[i]){    //取完当前字符为止
                    if(count == repeatLimit){    //若已经取到repeatLimit个
                        if(!lastchar(newstr,alphabet,i)){    //找次大字符,若没有直接返回结果
                            return newstr;
                        }
                        count = 0;    //重置取了几个
                    }
                    alphabet[i]--;    //没有取到repeatLimit个则对应字符个数-1
                    ++count;    //取值个数+1
                    newstr += i + 'a';    //取出字符
                }
            }
            
        }
        
        return newstr;
    }
};

?

文章来源:https://blog.csdn.net/m0_71386740/article/details/135571159
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。