力扣1234.替换子串得到平衡字符串
-
由题意可知 超过n/4的字母是一定要替换的
- 所以只要找到一段包含超过n/4个字母的最小区间即可
- 转换为去除这个最小区间后 4种字母的出现频率都<=n/4
cpp
class Solution {
public:
int balancedString(string s) {
unordered_map<char,int> cnt;
int n = s.size(),m = n/4,res=n;
for(int i=0;i<s.size();i++)
cnt[s[i]] ++;
//如果已经满足要求 直接return
if (cnt['Q'] == m && cnt['W'] == m && cnt['E'] == m && cnt['R'] == m)
return 0;
//枚举右端点
for(int i=0,j=0;i<n;i++)
{
//放入区间 同时删去
cnt[s[i]] --;
//满足要求
while (cnt['Q'] <= m && cnt['W'] <= m && cnt['E'] <= m && cnt['R'] <= m)
{
res = min(res,i-j+1);
//左端点加回来
cnt[s[j++]]++;
}
}
return res;
}
};