题面:
做法:如果考虑两边的区间,那么需要维护的就是时间(总区间长度)和选头还是选尾两个变量,这是一个的dp,考虑维护中间那个区间的长度,两边区间越长越好,中间区间也就是越短越好,此时问题就变成了一个简单的滑动窗口:
在字符串s内选择一个区间,此时a,b,c的数量分别为x,y,z,需要让这个区间最长且a,b,c的数量均小于下x-k,y-k,z-k。
代码:
class Solution {
public:
int takeCharacters(string s, int k) {
map<int,int> cnt;
cnt[0] = 0;
cnt[1] = 0;
cnt[2] = 0;
for (char c : s) {
cnt[c - 'a']++;
}
if (cnt[0] < k || cnt[1] < k || cnt[2] < k) {
return -1;
}
int mx = 0, l = 0;
for (int r = 0; r < s.length(); r++) {
char c = s[r] - 'a';
cnt[c]--;
while (cnt[c] < k) {
cnt[s[l] - 'a']++;
l++;
}
mx = max(mx, r - l + 1);
}
return s.length() - mx;
}
};