chaîne de l'équilibre [pensée de programmation et de la pratique Semaine5 travail C]

Description du sujet:

Une chaîne de longueur n s, qui ne contient que le « Q », « W », « E », « R » quatre types de caractères.
Si les deux le nombre de n / 4, il est équilibré par une série de quatre types de caractères apparaissent dans la chaîne.
S peut maintenant être période continue de la même longueur remplacer les sous - chaînes toute chaîne qui ne contient que quatre caractères, de sorte qu'il devient une chaîne équilibrée, alternativement demandé longueur minimum de la sous - chaîne?
Si s a équilibré sorties 0 .
. 1 <= n - <= 10. 5 ^
n-4 est un multiple de
la chaîne contient seulement le caractère 'Q', 'W', 'E' et 'R'.

Formats d'entrée:

Une ligne représentant une chaîne de caractères donnée s

formats de sortie:

Un entier qui représente la réponse

exemple:

Insérer ici l'image Description

idées:

Pour sélectionner une section de chaîne, de sorte que tout contenu change de telle sorte que toute la chaîne de chaîne de chaîne est équilibrée, les sous - chaînes doivent répondre aux conditions: la première partie de la chaîne à venir avec un certain nombre de lettres telles que les quatre types de la chaîne entière le même nombre, et la partie restante doit satisfaire à un multiple de 4, de sorte que quatre types de lettres peuvent être répartis également. À savoir, on suppose qu'il y a des lettres sous - chaîne m, tandis que le nombre du reste de la sous - chaîne externe de quatre lettres, respectivement a1, a2, a3, a4, prendre quatre chiffres , le nombre maximal de Max, les sous - chaînes doivent être enlevés q = Max-a1 + Max- a2 + a3 + Max-Max-a4 lettres pour remplacer la même quantité de telle sorte que quatre types de lettres, tandis que le reste doit mq positions également à une telle chaîne de quatre lettres à équilibrer, ce mq doit être divisible par 4.
Connaître le sous - chaîne après les critères de sélection, la question suivante est de savoir comment sélectionner les chaînes de sous-critère se rencontrent, si la sélection était onze O (2 n complexité), les indésirables importants.
approche d'échelle utilisé ici réalisée, à savoir l'utilisation d'environ deux chaîne entière de pointeur, du début à la fin de la glissière, analogue à une fenêtre glissante de taille variable, le premier pointeur gauche à la première chaîne, la première chaîne et le pointeur droit de glisser vers l'arrière , chaque sous - chaîne de bits supplémentaire, déterminé si elle est satisfait aux critères de sélection, non satisfaits, les résultats obtenus à la fin de la main gauche de la diapositive rencontre nécessairement les critères de sélection ne sont pas, devraient donc être telle que l'extrémité droite de la lame, puis la détermination, si substring pour répondre aux exigences, les résultats obtenus à l'extrémité droite de la main de la lame satisfont nécessairement la condition, mais sous - chaîne devient nécessairement long, et ne contribue pas aux résultats, à ce moment doivent être glissés au pointeur arrière gauche pour raccourcir la longueur de la chaîne, la sous - chaîne pour répondre aux conditions enregistrés sur une longueur variable qui, par rapport à la rencontre de prise continue les exigences minimales des résultats visés.
Cependant, cette méthode ne peut pas déterminer l'équilibre de la chaîne d' origine, il renvoie 1, cette situation doit être jugée à l' avance.

code:

#include <iostream>
#include<map>
#include<string.h>
using namespace std;
const int size=1e5+10;
char str[size];
map<char,int> mp;
int note[4]={0,0,0,0};
int n,l=1,r=0;
bool solve()
{
	int M=note[0];
	for(int i=1;i<4;i++)
		if(note[i]>M)
			M=note[i];
	int t=r-l+1;
	int temp=t-(M-note[0])-(M-note[1])-(M-note[2])-(M-note[3]);
	if(temp>=0&&temp%4==0)
		return true;
	else
		return false;
}
int main(int argc, char** argv) {
	mp['Q']=0;mp['W']=1;mp['E']=2;mp['R']=3;
	int n=1;
	scanf("%s",str+1);
	n=strlen(str+1);
	for(int i=1;i<=n;i++)
		note[mp[str[i]]]++; 
	int ans=size;
	if(note[0]==note[1]&&note[1]==note[2]&&note[2]==note[3])
		ans=0;
	else
	{
		while(r<=n)
		{
			while(l<=r&&solve())
			{
				ans=min(ans,r-l+1);
				note[mp[str[l]]]++;
				l++;
			}
			r++;note[mp[str[r]]]--;
		}
	}	
	printf("%d\n",ans);
	return 0;
}
Publié 24 articles originaux · éloge de won 8 · vues 527

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44034698/article/details/104993791
conseillé
Classement