解题思路
使用滑动窗口解决子串问题。起初没有看到子串,以为只要统计字符出现频率即可。
根据题意,如果在待替换子串之外的任意字符的出现次数都超过m = n / 4.那么无论怎么替换,都无法使这个字符的出现次数等于m
因此对于本题而言,只要在圈起的子串之外所有的字符出现次数都小于等于m即可替换。
对于本题,设子串的左右端点为left和right.枚举right 用right - left + 1更新ans即可得到答案。时间复杂度为O(n)空间复杂度为O©
代码
class Solution {
public:
int balancedString(string s) {
int n = s.length();
int m = n/4;
int cnt['X'] = {};
for(int i = 0; i < n; i++){
cnt[s[i]]++;
}
if(cnt['Q'] == m && cnt['W'] == m && cnt['E'] == m && cnt['R'] == m){
return 0;
}
int left = 0, right = 0, ans = n;
for(right = 0; right < n; right++){
--cnt[s[right]];
while(cnt['Q'] <= m && cnt['W'] <= m && cnt['E'] <= m && cnt['R'] <= m && left <= right){
ans = min(ans, right - left + 1);
++cnt[s[left++]];
}
}
return ans;
}
};