LeetCode: 1111. La profundidad de anidamiento de la solución efectiva de "dicotomía" entre paréntesis

Las cadenas de paréntesis válidas consisten solo en "(" y ")" y cumplen una de las siguientes condiciones:

Una
concatenación de cadena vacía , que puede registrarse como AB (A y B están concatenadas), donde A y B son cadenas de paréntesis válidas
Anidadas, que pueden registrarse como (A), donde A es una cadena de paréntesis válida

De manera similar, podemos definir la profundidad de profundidad de anidamiento (S) de cualquier cadena de paréntesis válida s: cuando
s está vacío, la profundidad ("") = 0
s es cuando A y B están conectados, la profundidad (A + B) = max ( profundidad (A), profundidad (B)), donde A y B son ambas cadenas de paréntesis válidas
s están anidadas, profundidad ("(" + A + ")") = 1 + profundidad (A), donde A es Cadena de soporte válida

Por ejemplo: "", "() ()" y "() (() ())" son cadenas de paréntesis válidas, y la profundidad de anidación es 0, 1, 2, respectivamente, mientras que ") (" y "((( ) ”No son cadenas de paréntesis válidas.

Le da una secuencia de cadena de paréntesis válida, divídala en dos subsecuencias disjuntas A y B, y A y B satisfacen la definición de cadena de paréntesis válida (nota: A.length + B.length = seq.length).

Ahora, debe seleccionar cualquier conjunto de cadenas de paréntesis válidas A y B para minimizar los posibles valores de max (profundidad (A), profundidad (B)).

Devuelva la respuesta de la matriz de respuestas cuya longitud es longitud seq. La regla de codificación para elegir A o B es: Si seq [i] es parte de A, entonces responda [i] = 0. De lo contrario, responda [i] = 1. Incluso si hay varias respuestas que cumplen con los requisitos, solo necesita devolver una.

Ejemplo 1:
Entrada: seq = "(() ())"
Salida: [0,1,1,1,1,0]

Ejemplo 2:
Entrada: seq = "() (()) ()"
Salida: [0,0,0,1,1,0,1,1]

Consejo:
1 <= text.size <= 10000

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings El
copyright pertenece a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

Ideas

El título es muy problemático. Esta pregunta significa encontrar una manera de dividir la cadena original en dos subcadenas, de modo que ambas subcadenas sean paréntesis válidos, y la profundidad de los paréntesis de las dos subcadenas es la más pequeña. Hoy es un día tonto, así que pensé de un vistazo Esta pregunta es una mochila 01, engañada

De hecho, la idea es muy simple: queremos reducir la profundidad de la cadena formada por las subsecuencias dividiendo las dos subsecuencias. Esta profundidad es en realidad la profundidad de la pila entre paréntesis válidos .

Reduzca
la profundidad. La profundización causada por el anidamiento no se puede evitar, pero podemos compensar esta profundidad moviéndonos a una nueva secuencia . Por ejemplo, el corchete actual está anidado en un corchete con una profundidad de n, pero siempre que lo seleccionemos en una subsecuencia B (suponiendo que B está vacío en este momento), entonces su profundidad es 0

Sin embargo, como hay más y más pares de paréntesis seleccionados en B, debido a que la subsecuencia misma también tiene un anidamiento profundo, la profundidad de la secuencia B será cada vez más profunda. Cómo elegir una estrategia de selección para equilibrar la profundidad Que?

Estrategia de asignación ¿
Piensa en cómo los árboles binarios equilibrados equilibran la altura? Intenta dividir los nodos por igual en ambos lados

Del mismo modo, adoptamos la estrategia de división equitativa, colocando los corchetes con profundidades impares en la secuencia A, y los corchetes con profundidades pares en la secuencia B.
Inserte la descripción de la imagen aquí
Por supuesto, puede haber otras estrategias, como el primer 1/2 de la profundidad se coloca en A, y el último 1 / 2 Póngalo en B, siempre que sean dos puntos

Código

Tenga en cuenta que no hay pila para simular. Debido a que la profundidad de la pila debe ser -1, y la profundidad de la pila debe ser +1, por lo que puede mantener el int. Tenga en cuenta que la profundidad se reduce después de que se elimina la pila, por lo que la declaración de profundidad se coloca después del juicio

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq)
    {
        vector<int> ans(seq.length());
        int depth = 0;
        for(int i=0; i<seq.length(); i++)
        {
            if(seq[i]=='(') depth++;

            if(depth%2==0) ans[i]=1;
            else ans[i]=0;

            if(seq[i]==')') depth--;
        }
        return ans;
    }
};
262 artículos originales publicados · ganó 11 · 10 mil visitas

Supongo que te gusta

Origin blog.csdn.net/weixin_44176696/article/details/105238550
Recomendado
Clasificación