LeetCode gráfico - 921. Adición mínima para que los paréntesis sean efectivos (Dificultad: Moderada)

¡Continúe creando, acelere el crecimiento! Este es el 7º día de mi participación en el "Nuevo plan diario de los Nuggets · Desafío de actualización de octubre", haz clic para ver los detalles del evento

1. El tema

Las cadenas entre corchetes son válidas solo si se cumple una de las siguientes condiciones:

  • es una cadena vacía, o
  • Se puede escribir  AB ( A y  B concatenar), donde  AB son cadenas válidas, o
  • Se puede escribir  (A)donde  A es una cadena válida.

Dada una cadena entre corchetes s, muévala N veces y podrá insertar un corchete en cualquier parte de la cadena.

Por ejemplo, si s = "()))", puede insertar un corchete de apertura como "(()))"o corchete de cierre como "())))".

Devuelve el número mínimo de paréntesis que se deben agregar para que la cadena resultante sea s válida .

2. Ejemplos

2.1> Ejemplo 1:

【Entrada】s = "())"
【Salida】1

2.2> Ejemplo 2:

【Entrada】s = "((("
【Salida】3

insinuación:

  • 1<= s.longitud <=1000
  • sContiene sólo  '('')' caracteres.

Tres, ideas para resolver problemas

这道题的题目描述真的挺让人费解的。其实题目的意思就是,我们如果想要配对好所有的括号,需要在原有字符串s的基础上,添加多少个括号(可能是左括号、也可能是右括号)。那么针对于这种配对类型类型的题目,第一个想法就是使用堆栈来实现。当然,对于括号配对的特殊性,即:左括号 + 右括号 。我们也可以根据这个规律去计算。如下是两种解题算法的详细解释。

3.1> 思路1:利用栈特性去计算

我们可以通过对字符串s进行每个字符的遍历,放到堆栈中。当发现栈顶字符是‘(’,待入栈的字符是‘)’,则符合括号匹配的情况。那么,此时我们只需将栈顶字符出栈即可。而针对于其他情况,我们都是将遍历的字符入栈即可。那么字符串s遍历完毕之后,我们来调用size()方法计算存储的字符长度,返回的长度就是这道题的结果。具体逻辑如下图所示:

针对该思路的代码实现,请参见:代码实现 4.1> 利用栈特性去计算

3.2> 思路2:找规律去匹配

La [pista] de la pregunta de paso ssolo contiene '(' y ')' caracteres. Por lo tanto, para la coincidencia de dos caracteres, hay cuatro casos, como se muestra en la figura a continuación. Entonces, solo [caso 1] coincidirá con éxito , y otros casos no coincidirán. Luego creamos dos variables: leftCount(número de paréntesis izquierdos) y rightCount(número de paréntesis derechos).

  • Si el carácter atravesado es un paréntesis izquierdo , ejecuteleftCount++
  • Si el carácter atravesado es un corchete de cierre y leftCount no es 0 , ejecuteleftCount--
  • Si el carácter atravesado es un corchete de cierre y leftCount es igual a 0 , ejecuterightCount++

Para ver la implementación de código de esta idea, consulte: Implementación de código 4.2> Encuentre las reglas que coincidan

Cuarto, implementación de código.

4.1> Implementación 1: use la función de pila para calcular

class Solution {
    public int minAddToMakeValid(String s) {
        Deque<Character> deque = new ArrayDeque();
        for (char sc : s.toCharArray()) {
            if (deque.size() != 0 && (deque.peekLast()).equals('(') && sc == ')') deque.removeLast();
            else deque.addLast(sc);
        }
        return deque.size();
    }
}
复制代码

4.2> Realización 2: Encuentra reglas que coincidan

class Solution {
    public int minAddToMakeValid(String s) {
        int leftCount = 0, rightCount = 0;
        for (char item : s.toCharArray()) {
            if (item == '(') {
                leftCount++;
            } else {
                if (leftCount == 0) rightCount++;
                else leftCount--;
            }               
        }
        return leftCount + rightCount;
    }
}
复制代码

Eso es todo por el artículo de hoy:

Escribir no es fácil. Un artículo completado en unas pocas horas o incluso días por el autor solo se intercambiará por unos segundos de Me gusta y acciones de parte tuya .

Para productos secos más técnicos, puede prestar atención a la cuenta pública " Java Muse " ~ \(^o^)/ ~ "Compartir productos secos, actualizado todos los días"

Supongo que te gusta

Origin juejin.im/post/7150464878791098375
Recomendado
Clasificación