思路
注意要替换的是子串,必须连续,自然想到连续窗口;
对于窗口内的可以任意替换,而窗口外的不能更改,所以这必然要求窗口外的各字母数量小于等于n/4,这样才能在窗口内补上,但如果超过就不能更改,必然不满足条件,所以第一步先统计每个字母次数,用哈希表计数,(数组也可以)。
当窗口外计数满足,则更新答案,并试探更小的窗口;当不能缩小时再后移窗口。
对于每个窗口内的位置,将其计数减一,出窗口后就加一恢复,可变滑动窗口遍历整个字符串,最小窗口即是答案。
代码
class Solution {
public:
bool isrigt(unordered_map<char, int>& count, int ave) {
for(auto x : count)
if(x.second > ave) return false;
return true;
}
int balancedString(string s) {
int n = s.size();
int ave = n / 4;
unordered_map<char, int> count;
for(auto x : s)
count[x]++;
if(isrigt(count, ave)) return 0;
int ans = n;
int l = 0, r = 0;
while(r < n) {
count[s[r]]--;
while(l <= r && isrigt(count,ave)) {
ans = min(ans, r-l+1);
count[s[l]]++;
l++;
}
r++;
}
return ans;
}
};