Emploi Semaine5 C

La signification des problèmes:
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 .
entrée:
ligne représentant une chaîne de caractères S donnée de
sortie:
une réponse entière
entrée de l' échantillon:
qwer
Exemple de sortie:
0
entrée échantillon:
QQWE
Exemple de sortie:
. 1
entrée échantillon:
QQQW
Exemple de sortie:
2 d'
entrée de l' échantillon:
la QQQQ
Exemple de sortie:
. 3
Remarque :
. 1 <= n - <= 10. 5 ^
n-4 est un multiple de
la chaîne contient seulement le caractère 'Q', 'W', 'E' et 'R'.
idées:
Pour déterminer le nombre de chaque caractère dans la chaîne d'entrée. Après la détermination, si le nombre de caractères par ligne avec les exigences du sujet à 0. Dans le cas contraire, la sortie sera supérieure à n caractères opération -n. Les caractères restants stockés afin qu'il soit déterminé à nouveau après une valeur de 0. Le nombre de chaque caractère, qui est comparé avec le nombre de caractères stockés avant l'opération, puis exploité par les frontières gauche et à droite, la condition est satisfaite, la marge de gauche est réduite, rencontrer les personnages, le nombre de caractère est réduit de 1, n'est pas satisfait, le droit d'augmenter la frontière, rencontre bordure droite les caractères, le nombre de caractères plus un, toujours en mouvement autour du juge des frontières, mettre à jour la réponse, sortie .

code:

#include<iostream>
#include<cstring>
#include<map>
using namespace std;
char temp[4]={'Q','W','E','R'};
map<char,int> ran;
int main()
{
	string s;
	cin>>s;
	//int length=s.length();
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='Q')
		{
			ran[temp[0]]++;
		}
		if(s[i]=='W')
		{
			ran[temp[1]]++;
		}
		if(s[i]=='E')
		{
			ran[temp[2]]++;
		}
		if(s[i]=='R')
		{
			ran[temp[3]]++;
		}
	}
	int n=s.length()/4;
	if(ran[temp[0]]==n&&ran[temp[1]]==n&&ran[temp[2]]==n&&ran[temp[3]]==n)
	{
		cout<<"0";
		return 0;
	}
	int num=0;
	for(int i=0;i<4;i++)
	{
		if(ran[temp[i]]>n)
		{
			ran[temp[i]]=ran[temp[i]]-n;
			num=num+ran[temp[i]];
		}
		else
		{
			ran[temp[i]]=0;
		}
	}
	int left=0,right=0;
	int cm[4]={0};
	int ans=s.length();
	for(int i=left;i<=right;i++)
	{
		if(s[i]=='Q')
		{
			cm[0]++;
		}
		if(s[i]=='W')
		{
			cm[1]++;
		}
		if(s[i]=='E')
		{
			cm[2]++;
		}
		if(s[i]=='R')
		{
			cm[3]++;
		}
		
	}
	while(right<s.length())
	{
		if(cm[0]>=ran[temp[0]]&&cm[1]>=ran[temp[1]]&&cm[2]>=ran[temp[2]]&&cm[3]>=ran[temp[3]])
		{
			if((right-left)<ans)
			   ans=right-left+1;
			if(s[left]=='Q')
			   cm[0]--;
			if(s[left]=='W')
			   cm[1]--;
			if(s[left]=='E')
			   cm[2]--;
			if(s[left]=='R')
			   cm[3]--;
			left++;
		}
		else
		{
			right++;
			if(s[right]=='Q'&&right!=s.length())
			   cm[0]++;
			if(s[right]=='W'&&right!=s.length())
			   cm[1]++;
			if(s[right]=='E'&&right!=s.length())
			   cm[2]++;
			if(s[right]=='R'&&right!=s.length())
			   cm[3]++;
		}
	}
	cout<<ans;
	return 0;
 } 
Publié 19 articles originaux · louanges gagnées 0 · Vues 206

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45117273/article/details/105331776
conseillé
Classement