Intentando resolver un problema en LeetCode llamado "Paréntesis válidos".
Las condiciones son:
Dada una cadena que contiene solo los caracteres '(', ')', '{', '}', '[' y ']', determine si la cadena de entrada es válida.
Una cadena de entrada es válida si:
Los corchetes abiertos deben cerrarse con el mismo tipo de corchetes. Los corchetes abiertos deben cerrarse en el orden correcto.
Escribí una función y está funcionando en este fragmento:
let arr = ['()'] var isValid = function (data) { let stack = []; const bracketsArray = { '{':'}', '[':']', '(':')' } for (i=0; i < data[0].length; i++) { if (data[0][i] == '{' || data[0][i] == '(' || data[0][i] == '[') { stack.push(data[0][i]); } else if (data[0][i] == '}' || data[0][i] == ']' || data[0][i] == ')') { if (bracketsArray[stack[stack.length-1]] == data[0][i]) { stack.pop() } } } if (stack.length == 0) { return true } else { return false } } console.log(isValid(arr))La función da un resultado correcto (booleano) Pero cuando ejecuto este código en LeetCode por alguna razón, el mismo código me da un valor booleano incorrecto.
No entiendo lo que está mal.
/** * @param {string} s * @return {boolean} */ var isValid = function(s) { let stack = []; const bracketsArray = { '{':'}', '[':']', '(':')' } for (i=0; i < s[0].length; i++) { if (s[0][i] == '{' || s[0][i] == '(' || s[0][i] == '[') { stack.push(s[0][i]); } else if (s[0][i] == '}' || s[0][i] == ']' || s[0][i] == ')') { if (bracketsArray[stack[stack.length-1]] == s[0][i]) { stack.pop() } } } if (stack.length == 0) { return true; } else { return false; } };¿Algún consejo?
En LeetCode, el parámetro de función es una cadena, pero en sus pruebas está pasando una matriz, y también su código de función espera una matriz, ya que accede a la cadena con s[0] , en lugar de s .
Sin relación, pero:
Su código falla cuando la entrada es solo un paréntesis de cierre. Esto se debe a que su ciclo no se rompe con el return false cuando se encuentra un paréntesis de cierre que no coincide. Esto debería suceder en la parte else de if (bracketsArray[stack[stack.length-1]] == s[i]) {
No use una variable no declarada i , que implícitamente se convertirá en una variable global (si se ejecuta en modo no estricto).
No nombre su variable bracketsArray ya que no es una matriz.
Haga más uso de ese objeto, en lugar de hacer tres comparaciones con paréntesis de apertura.
El if...then final es una exageración para simplemente devolver el valor de una expresión booleana.
Asi que:
var isValid = function(s) { const stack = []; const brackets = { '{':'}', '[':']', '(':')' } const closing = Object.values(brackets); for (let ch of s) { if (brackets[ch]) { stack.push(brackets[ch]); } else if (ch == stack.at(-1)) { stack.pop() } else if (closing.includes(ch)) { return false; } } return !stack.length; }; console.log(isValid("{([])}")); // true console.log(isValid("]")); // falseLa forma en que está accediendo al carácter actual de la iteración es incorrecta. En lugar de hacer s[0][i] , simplemente haz s[i] .
s[0][i] accede al primer carácter y luego intenta obtener la i-ésima entrada (que no está definida).
var isValid = function(s) { let stack = []; const bracketsArray = { '{':'}', '[':']', '(':')' } for (i=0; i < s.length; i++) { if (s[i] == '{' || s[i] == '(' || s[i] == '[') { stack.push(s[i]); } else if (s[i] == '}' || s[i] == ']' || s[i] == ')') { if (bracketsArray[stack[stack.length-1]] == s[i]) { stack.pop() } } } if (stack.length == 0) { return true; } else { return false; } }; isValid("{([])}") // true isValid("{([)}") // false