leetcode 2516. 每种字符至少取 K 个

逆向思维:滑动窗口内的字符a最多个数为(原字符串a的个数 - k),b和c同理。求出这个滑动窗口最长长度res,结果返回size-res
class Solution {
public:
int takeCharacters(string s, int k) {
int size = s.size(),res = 0;
int letterCount[3]{};
for(char &letter : s) ++letterCount[letter-'a'];
if(letterCount[0] < k || letterCount[1] < k || letterCount[2] < k) return -1;
for(int left = 0,right = 0,nowCount[3]{};right < size;++right){
++nowCount[s[right]-'a'];
while(nowCount[s[right]-'a'] > letterCount[s[right]-'a'] - k){
--nowCount[s[left++]-'a'];
}
res = max(res,right-left+1);
}
return size - res;
}
};
浙公网安备 33010602011771号