?思路:先記錄每個字符的出現(xiàn)次數(shù),構(gòu)建一個新字符串,從尾取字符,每取一個該字符個數(shù)-1,若該字符已經(jīng)取到有repeatLimit個,則遞歸取次大的字符,并對應字符個數(shù)-1,若沒有次大字符了,則直接返回
代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-789324.html
class Solution {
public:
bool lastchar(string &s, vector<int>& alphabet, int i){ //遞歸找次大字符
if(--i == -1) return false; //沒有返回false
if(alphabet[i] != 0){
alphabet[i]--; //找到了對應字符個數(shù)-1
s += i + 'a'; //取出字符
return true; //有返回true
}
return lastchar(s, alphabet, i);
}
string repeatLimitedString(string s, int repeatLimit) {
vector<int> alphabet(26); //記錄每個字母個數(shù)
for(auto letter : s) //記錄
alphabet[letter - 'a']++;
string newstr = ""; //存儲結(jié)果
for(int i = 25; i >= 0; --i){
if(alphabet[i] != 0){
int count = 0; //記錄當前字符取了幾個了
while(alphabet[i]){ //取完當前字符為止
if(count == repeatLimit){ //若已經(jīng)取到repeatLimit個
if(!lastchar(newstr,alphabet,i)){ //找次大字符,若沒有直接返回結(jié)果
return newstr;
}
count = 0; //重置取了幾個
}
alphabet[i]--; //沒有取到repeatLimit個則對應字符個數(shù)-1
++count; //取值個數(shù)+1
newstr += i + 'a'; //取出字符
}
}
}
return newstr;
}
};
?文章來源地址http://www.zghlxwxcb.cn/news/detail-789324.html
到了這里,關(guān)于力扣2182.構(gòu)造限制重復的字符串的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!