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

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

力扣2182.构造限制重复的字符串_第1张图片

代码:

class Solution {
public:

    bool lastchar(string &s, vector& 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 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;
    }
};

 

你可能感兴趣的:(力扣刷题笔记,leetcode,算法,职场和发展,c++)