1234. 替换子串得到平衡字符串
题目:
有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串。
假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。
给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」。
你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。
请返回待替换子串的最小可能长度。
如果原字符串自身就是一个平衡字符串,则返回 0。
思路:
- 设 ,先选择一个子串s作为【待替换字符串】
- 只有当除了s的剩余部分【不替换字符串】中“Q”,“W”,“E”,“R”的个数都≤m时,替换s中的字母才可能让字符串平衡
- eg:如果【不替换字符串】中某字母>m,则就算待替换子串中该字母个数为0,也达不到平衡
- 因此我们先哈希表统计原串的字符个数
- 再固定左边界,移动右边界,如果剩余部分【不替换字符串】中所有字母个数均≤m,则说明可以构造平衡字符串,则用滑窗长度更新最小替换子串长度
- 然后移动左边界,对子串长度进行缩小
class Solution {
public int balancedString(String s) {
int res=0x3f3f3f3f;
int[] a=new int[4];
String t="QWER";
int n=s.length();
for(char c:s.toCharArray()) a[t.indexOf(c)]++;
int m=n/4;
if(a[0]==m&&a[1]==m&&a[2]==m&&a[3]==m) return 0;
for(int r=0,l=0;r<n;r++)
{
char c=s.charAt(r);
a[t.indexOf(c)]--;
while(a[0]<=m&&a[1]<=m&&a[2]<=m&&a[3]<=m)
{
res=Math.min(res,r-l+1);
char x=s.charAt(l++);
a[t.indexOf(x)]++;
}
}
return res;
}
}