Estoy resolviendo una pregunta de algoritmo que requiere que me asegure de que los corchetes, paréntesis y llaves se coloquen en el orden o secuencia correctos.
Aquí hay un enlace a la pregunta, https://leetcode.com/problems/valid-parentheses/
A continuación se muestra un ejemplo:
Aquí está mi código para la solución:
const isParenthesisValid = (params) => { myList = [] lastElement = myList[myList.length - 1] for (let i = 0; i < params.length; i++) { if (params[i] === "(" || params[i] === "[" || params[i] === "{" ) { myList.push(params[i]) } else if ((params[i] === ")" && lastElement === "(") || (params[i] === "]" && lastElement === "[") || (params[i] === "}" && lastElement === "{")) { myList.pop() } else return false } return myList.length ? false : true } // I get false as an answer everytime whether the pattern is correct or wrong // false console.log(isParenthesisValid("[()]"))Pero no sé por qué siempre obtengo falso, comparé mi respuesta con la respuesta de otra persona que hizo lo mismo, pero parece que estoy omitiendo algo que no es tan obvio.
Espero que alguien pueda señalar en mi código dónde me estoy equivocando.
Su lastElement recupera el último elemento de la lista al comienzo del programa , cuando no existe tal elemento, por lo que siempre está undefined . En su lugar, debe recuperar el valor dentro del bucle.
const isParenthesisValid = (params) => { myList = [] for (let i = 0; i < params.length; i++) { const lastElement = myList[myList.length - 1] if (params[i] === "(" || params[i] === "[" || params[i] === "{" ) { myList.push(params[i]) } else if ((params[i] === ")" && lastElement === "(") || (params[i] === "]" && lastElement === "[") || (params[i] === "}" && lastElement === "{")) { myList.pop() } else return false } return myList.length ? false : true } console.log(isParenthesisValid("[()]"))O, un poco más legible:
const isParenthesisValid = (input) => { const openDelimiters = []; for (const delim of input) { const lastElement = openDelimiters[openDelimiters.length - 1]; if (delim === "(" || delim === "[" || delim === "{") { openDelimiters.push(delim) } else if ((delim === ")" && lastElement === "(") || (delim === "]" && lastElement === "[") || (delim === "}" && lastElement === "{")) { openDelimiters.pop() } else return false } return openDelimiters.length === 0; } console.log(isParenthesisValid("[()]"))Otro enfoque, vinculando cada delimitador con un objeto:
const delims = { ')': '(', '}': '{', ']': '[', }; const isParenthesisValid = (input) => { const openDelimiters = []; for (const delim of input) { if ('([{'.includes(delim)) { openDelimiters.push(delim) } else if (')]}'.includes(delim) && openDelimiters[openDelimiters.length - 1] === delims[delim]) { openDelimiters.pop() } else return false } return openDelimiters.length === 0; } console.log(isParenthesisValid("[()]"))