如何解决我的 "isParenthesisValid" 算法代码中的问题

How to fix issue in my "isParenthesisValid" algorithm code

我正在解决一道算法题,它要求我确保方括号、圆括号和大括号的顺序正确。

这是一个link问题,https://leetcode.com/problems/valid-parentheses/

示例如下:

这是我的解决方案代码:

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("[()]"))

但我不知道为什么我每次都报错,我将我的答案与其他人的答案进行了比较,但似乎我遗漏了一些不太明显的东西。

我希望有人能在我的代码中指出我哪里做错了。

您的 lastElement 在程序开始时 检索列表的最后一个元素 - 当没有这样的元素时 - 所以它总是 undefined .您需要改为在循环内检索值。

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("[()]"))

或者,更易读一点:

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("[()]"))

另一种方法,将每个分隔符与一个对象链接起来:

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("[()]"))