思路:先记录每个字符的出现次数,构建一个新字符串,从尾取字符,每取一个该字符个数-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;
}
};