最开始把题看错了,注意题目要求返回的是最小子串的长度,而不是要修改的次数。。。
思路
这道题基本的思路是滑动窗口。
- 首先统计每个字符出现的次数,之后相加得到总和,总和除以 4 得到每个字符应该出现的次数。
- 用双指针 left 和 right ,开始都指向 0。right 开始向右移动,直到满足条件。然后 left 向右移动,直到不满足条件。然后 right 又继续向右移动,知道满足条件…… 这样循环下去。
这里的满足条件就是每个字符的次数都为平均值,我们只需要跟踪大于平均值的数,而小于平均值的数会被自动补上,就不需要理会它们了。
所以判断是否 balanced 是基于这句
cnt['Q'] > avg || cnt['W'] > avg || cnt['E'] > avg || cnt['R'] > avg
最后的代码如下:
class Solution {
public int balancedString(String s) {
char[] a = s.toCharArray();
int[] cnt = new int[256];
for (char c : a) {
cnt[c]++;
}
int res = s.length();
int avg = (cnt['Q'] + cnt['W'] + cnt['E'] + cnt['R']) / 4;
int left = 0, right = 0;
while (right <= a.length) {
if (cnt['Q'] > avg || cnt['W'] > avg || cnt['E'] > avg || cnt['R'] > avg) {
if (right == a.length) {
break;
}
cnt[a[right++]]--;
continue;
}
res = Math.min(res, right - left);
if (res == 0) {
return 0;
}
cnt[a[left++]]++;
}
return res;
}
}