Chaîne d'équilibre

Sujet: une chaîne s de longueur n, qui ne contient que les quatre caractères «Q», «W», «E», «R».
Si le nombre d'occurrences des quatre caractères de la chaîne de caractères est n / 4, il s'agit d'une chaîne de caractères équilibrée.
Vous pouvez maintenant remplacer une sous-chaîne continue dans s par une chaîne arbitraire de la même longueur qui ne contient que ces quatre caractères, ce qui en fait une chaîne équilibrée. Quelle est la longueur minimale de la sous-chaîne de remplacement?
Si s est équilibré, alors affichez 0 .

Entrée: une
ligne de caractères représente la chaîne donnée s

Sortie:
Un entier indique la réponse
. Je ne donnerai pas d'exemples ici.

Idée de succession: Les problèmes généraux de valeur extrême peuvent être dichotomiques, mais ce problème peut être pris avec une règle, en maintenant un intervalle continu, et la complexité temporelle n'est pas élevée, elle est linéaire.

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int q,w,e,r,n;
int main()
{
    string a;
    q=w=e=r=0;
    cin>>a;
    n=a.size();
    for(int i=0;i<a.size();i++)//初始化
    {
        if(a[i]=='Q')q++;
        else if(a[i]=='W')w++;
        else if(a[i]=='E')e++;
        else r++;
    }
    if(q==n/4&&w==n/4&&e==n/4)cout<<0<<endl;//一开始就满足
    else
    {
        int ll=0,rr=0,ans=n+1;//尺取
        while(1)
        {
            int q1=0,w1=0,e1=0,r1=0;
            int q2=q,w2=w,e2=e,r2=r;
            for(int i=ll;i<=rr;i++)
            {
                if(a[i]=='Q')q1++;
                else if(a[i]=='W')w1++;
                else if(a[i]=='E')e1++;
                else r1++;
            }
            q2-=q1,w2-=w1,e2-=e1,r2-=r1;
            int h=max(max(q2,w2),max(e2,r2));
            int total=rr-ll+1-(4*h-q2-w2-e2-r2);//减去达到平均的最低要求
            if(total>=0&&total%4==0)//这里只要满足减去之后mod4=0即可            			    
            {
                ans=min(ans,rr-ll+1);//满足左区间右移
                ll++;
            }else//不满足右区间右移
            {
                rr++;
            }
            if(ans==1||rr==n)
            {
                break;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
PGZ
Publié 34 articles originaux · aimé 0 · visites 876

Je suppose que tu aimes

Origine blog.csdn.net/qq_43653717/article/details/104972999
conseillé
Classement