[Programación de pensamiento y la práctica Semana5 trabajo C] cadena de equilibrio

Descripción Asunto:

Una cadena de longitud n s, que contiene sólo la 'Q', 'W', 'E', 'R' cuatro tipos de caracteres.
Si tanto el número de n / 4, que se equilibra con una serie de cuatro clases de personajes aparecen en la cadena.
S puede ser ahora período continuo de los mismos subcadenas de longitud reemplazar cualquier cadena que contiene sólo cuatro caracteres, por lo que se convierte en una cadena equilibrada, de forma alternativa preguntó longitud mínima de la subcadena?
Si s ha equilibrado salidas 0 .
. 1 <= n - <= 10. 5 ^
n-4 es un múltiplo de
la cadena contiene sólo el carácter 'Q', 'W', 'E' y 'R'.

Formatos de entrada:

Una línea que representa una cadena de caracteres dada s

Los formatos de salida:

Un entero que representa la respuesta

Ejemplo:

Aquí Insertar imagen Descripción

ideas:

Para seleccionar una sección de cuerda, de manera que cualquier contenido cambia de tal manera que toda la cadena de cadena de cadena se equilibra, las subseries deben cumplir con las condiciones de que: la primera porción de la cadena para llegar a una serie de cartas de tal manera que las cuatro clases de la cadena completa el mismo número, y la parte restante deben satisfacer un múltiplo de 4, por lo que cuatro tipos de cartas se pueden dividir por igual. Es decir, se supone que hay m subcadena letras, mientras que el número del resto de la subcadena exterior de cuatro letras, respectivamente a1, a2, a3, a4, tomar cuatro números el número máximo de Max, las subcadenas deben eliminarse q = Max-Max-a1 + a2 + a3 + Max-Max-a4 cartas para reemplazar la misma cantidad de manera que cuatro tipos de cartas, mientras que el resto debe mq posiciones igualmente a una cadena como de cuatro letras que ser equilibrada, mq que debe ser divisible por 4.
Conocer la subcadena después de que los criterios de selección, la siguiente pregunta es cómo seleccionar el criterio de sub-cadenas se encuentran, si la selección tenía once O (2 n- complejidad), la significativa indeseable.
enfoque escala utilizada aquí logrado, es decir, el uso de todo alrededor de dos puntero de cadena, desde el principio hasta el final de la corredera, similar a un tamaño variable de ventana deslizante, primero puntero apunta izquierda para la primera cadena, la primera cadena y el puntero derecha desde deslizante a la parte trasera , cada una subcadena bit adicional, determinado si se satisface los criterios de selección, no satisfecho, los resultados obtenidos en el extremo izquierdo de la corredera necesariamente cumple con los criterios de selección no son, por lo tanto debe ser tal que el extremo de la derecha de la corredera, a continuación, la determinación, si subcadena para cumplir con los requisitos, los resultados obtenidos hasta el extremo derecho de la corredera satisfacen necesariamente la condición, pero subcadena necesariamente se convierte en mucho tiempo, y no contribuye a los resultados, en este momento debe ser deslizado al puntero trasera izquierda para acortar la longitud de la cadena, la subcadena para cumplir con las condiciones grabada en el que una longitud variable, en comparación con el de los requisitos mínimos de los resultados sujetos derivación continua se encuentran.
Sin embargo, este método no se puede determinar en el equilibrio de la cadena original, devuelve 1, por lo que esta situación debe ser juzgado por adelantado.

código:

#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;
}
Publicado 24 artículos originales · ganado elogios 8 · visitas 527

Supongo que te gusta

Origin blog.csdn.net/weixin_44034698/article/details/104993791
Recomendado
Clasificación