Medium
You are given a string s of length n
containing only four kinds of characters: 'Q'
, 'W'
, 'E'
, and 'R'
.
A string is said to be balanced if each of its characters appears n / 4
times where n
is the length of the string.
Return the minimum length of the substring that can be replaced with any other string of the same length to make s
balanced. If s is already balanced, return 0
.
Example 1:
Input: s = “QWER”
Output: 0
Explanation: s is already balanced.
Example 2:
Input: s = “QQWE”
Output: 1
Explanation: We need to replace a ‘Q’ to ‘R’, so that “RQWE” (or “QRWE”) is balanced.
Example 3:
Input: s = “QQQW”
Output: 2
Explanation: We can replace the first “QQ” to “ER”.
Constraints:
n == s.length
4 <= n <= 105
n
is a multiple of 4
.s
contains only 'Q'
, 'W'
, 'E'
, and 'R'
.public class Solution {
public int balancedString(String s) {
int n = s.length();
int ans = n;
int excess = 0;
int[] cnt = new int[128];
cnt['Q'] = cnt['W'] = cnt['E'] = cnt['R'] = -n / 4;
for (char ch : s.toCharArray()) {
if (++cnt[ch] == 1) {
excess++;
}
}
if (excess == 0) {
return 0;
}
int i = 0;
int j = 0;
while (i < n) {
if (--cnt[s.charAt(i)] == 0) {
excess--;
}
while (excess == 0) {
if (++cnt[s.charAt(j)] == 1) {
excess++;
}
ans = Math.min(i - j + 1, ans);
j++;
}
i++;
}
return ans;
}
}