C题 平衡字符串
题目描述:
一个长度为 n 的字符串 s,其中仅包含 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符。
如果四种字符在字符串中出现次数均为 n/4,则其为一个平衡字符串。
现可以将 s 中连续的一段子串替换成相同长度的只包含那四个字符的任意字符串,使其变为一个平衡字符串,问替换子串的最小长度?
如果 s 已经平衡则输出0。
Input
一行字符表示给定的字符串s
Output
一个整数表示答案
Examples
Input
QWER
Output
0
Input
QQWE
Output
1
Input
QQQW
Output
2
Input
QQQQ
Output
3
解题思路:尺取法
首先我们用a[4]数组将这个字符串内的’Q’,‘W’,‘E’,'R’字母的个数统计出来,如果他们的个数都相等那么就是平衡状态
否则,我们不断更新数组a,在不包括[l,r]区间内的个数,然后进行填平操作
判断空闲位置是否是4的倍数,并且total>0,则l++;不然的话就r++,扩大区间
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
string s;
cin>>s;
int n=s.length();
int a[4];
for(int i=0;i<4;i++) a[i]=0;
int ans=n+1;
for(int i=0;i<n;i++)
{
if(s[i]=='Q') a[0]++;
else if(s[i]=='W') a[1]++;
else if(s[i]=='E') a[2]++;
else if(s[i]=='R') a[3]++;
}
if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3])
cout<<"0"<<endl;
int l=0,r=0;
for(int i=l;i<=r;i++) //[l,r]区间内各个字符的个数
{
if(s[i]=='Q') a[0]--;
else if(s[i]=='W') a[1]--;
else if(s[i]=='E') a[2]--;
else if(s[i]=='R') a[3]--;
}
while(l<n&&r<n)
{
int maxx=max(max(a[0],a[1]),max(a[2],a[3]));
int total=r-l+1;
total-=(maxx-a[0])+(maxx-a[1])+(maxx-a[2])+(maxx-a[3]);
if(total>=0&&total%4==0)
{
if(s[l]=='Q') a[0]++;
else if(s[l]=='W') a[1]++;
else if(s[l]=='E') a[2]++;
else if(s[l]=='R') a[3]++;
ans=min(ans,r-l+1);
l++;
}
else{
r++;
if(s[r]=='Q') a[0]--;
else if(s[r]=='W') a[1]--;
else if(s[r]=='E') a[2]--;
else if(s[r]=='R') a[3]--;
}
}
cout<<ans<<endl;
return 0;
}