leetcode 2516. 每种字符至少取 K 个
题目描述
滑动窗口问题
可以转化为求按照题目要求从两端取走字符后,中间部分的最大长度。中间部分就是一个滑动窗口。
class Solution {
public:int takeCharacters(string s, int k) {vector<int> count(3,0);int n = s.size();for(int i = 0;i <n;i++){count[s[i] - 'a']++;}if(count[0] < k || count[1] < k || count[2] < k)return -1;int a_threshold = count[0] - k;int b_threshold = count[1] - k;int c_threshold = count[2] - k;int right = 0;int max_len = 0;int a_count = 0;int b_count = 0;int c_count = 0;for(int left = 0;left < n;left++){while(a_count <= a_threshold && b_count<= b_threshold && c_count<= c_threshold){max_len = max(max_len,right -left);//[left,right)if(right == n)break;if(s[right] == 'a') a_count++;if(s[right] == 'b') b_count++;if(s[right] == 'c') c_count++;right++;}if(s[left] == 'a') a_count--;if(s[left] == 'b') b_count--;if(s[left] == 'c') c_count--;}return n - max_len;}
};