LeetCode第20题:有效的括号

题干

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

实例:

输入:s = "()[]{}"
输出:true
复制代码
输入:s = "([)]"
输出:false
复制代码

解法:栈的特性

实际上我们可以先将字符串遍历一遍,然后在遍历的同时,如果我们遇到的是左括号,将其置入栈中,然后再将如果遍历到的是右括号,则使其于栈顶元素相比较,如果与之匹配,则移除栈顶元素,以此类推,如果遍历到的右括号于栈顶元素不等,可以直接返回false,因为这是括号的特性。最后遍历完以后看我们的栈是否为空,如果为空则说明符合我们的要求,如果不为空,则返回false

注意:我们不需要将右括号置入栈中,右括号只是用来比较的。

代码实现:

执行用时:76 ms, 在所有 JavaScript 提交中击败了95.12%的用户

内存消耗:39.3 MB, 在所有 JavaScript 提交中击败了25.41%的用户

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    // 遍历字符串,使每一个左括号都在栈顶,然后当遇到右括号时,判断他与最近的栈顶对不对应,如果对应就匹配成功,移除栈顶元素即可
    let stack = [];
    for (let i = 0; i < s.length; i++) {
        if (s.charAt(i) === '[' || s.charAt(i) === '(' || s.charAt(i) === '{') {
            stack.push(s.charAt(i))
        } else {
            if (stack.length == 0) {
                return false
            }
            let lastcode = stack.length - 1
            if (s.charAt(i) === ')' && stack[lastcode] === '(' || s.charAt(i) === '}' && stack[lastcode] === '{' || s.charAt(i) === ']' && stack[lastcode] === '[') {
                stack.pop()//如果匹配成功移除栈顶元素
            }else{
                return false
            }
        }
    }
    return stack.length===0
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享