La longitud efectiva más larga de la cuerda del soporte

La longitud efectiva más larga de la cuerda del soporte

Descripción del Título

Dada una cadena de corchetes str, devuelve la longitud de la cadena más larga que puede coincidir exactamente con la cadena de caracteres del corchete.

Ingrese una descripción:

Genere una línea de cadena, que representa str (1 ≤ lengthstr ≤ 1 0 5) str (1 \ leq length_ {str} \ leq 10 ^ 5)s t r ( 1l e n g t hs t r1 05 )

Descripción de salida:

Genere un número entero que represente la longitud válida más larga de la cadena de corchetes.

Ejemplo 1
entrar
(()())
Salida
6
Ejemplo 2
entrar
())
Salida
2
Observaciones:

Complejidad temporal O (n) O (n)O ( n ) , complejidad espacial adicionalO (n) O (n)O ( n )


responder:

Programación dinámica unidimensional, F [i] representa la longitud de la subcadena de corchete válida más larga que str [0 ... i] termina con el carácter str [i], dividida en las siguientes situaciones:

  • Si str [i] == '(', entonces F [i] = 0, porque la cadena de corchetes válida debe terminar con '(';
  • Si str [i] == ')', puede existir la subcadena de corchete válida más larga que termina en str [i]. F [i-1] representa la subcadena de corchete válida más larga que termina en str [i-1] Si la longitud de str [iF [i-1] -1] es '(', se puede emparejar con str [i] con paréntesis válidos, es decir, F [i] = F [i-1] + 2. Sin embargo, nuestro F [i] está representado por la cadena [i] al final de la longitud efectiva más larga de la subcadena entre paréntesis , por lo que también debemos agregar a la sección anterior, es decir, F [i] + = F [ iF [i-1] -2 ], y luego registre el mayor F [i].
Código:
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 100001;

char s[N];
int f[N];

int main(void) {
    
    
    scanf("%s", s);
    int i, t, ret = 0;
    for (i = 1; s[i]; ++i) {
    
    
        if (s[i] == '(') continue;
        t = i - f[i - 1] - 1;
        if (t >= 0 && s[t] == '(') {
    
    
            f[i] = f[i - 1] + 2;
            if (t > 0)
                f[i] += f[t - 1];
        }
        if (f[i] > ret) ret = f[i];
    }
    printf("%d\n", ret);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/MIC10086/article/details/108907968
Recomendado
Clasificación