LeetCode[20]有效的括号
一天一道算法题系列,趁还刷的动,速度走起。
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路
由于对若干个符号进行匹配,所以用数组存放会比较好些,当我们遇到右侧类型的括号时,需要与前一个比较,此时,该数组最好是个栈类型的(js数组完美支持)。
由于比较时,利用 === 这种方式双比较太复杂,所以使用正反括号为正负数值的方式方便判断。
实现
/**
 * @param {string} 
 * @return {boolean}
 */
var isValid = function(s) {
    const len = s.length
    const map = {
        '(': -1,
        ')': 1,
        '{': -2,
        '}': 2,
        '[': -3,
        ']': 3,
        '': 0
    }
    const list = []
    let res = true
    for (let ind = 0; ind < len; ++ind) {
        if (['(', '{', '['].indexOf(s[ind]) > -1) {
            list.push(s[ind])
        } else {
            let prev = list.pop() || ''
            if (map[prev]+ map[s[ind]]) {
                // 匹配不上
                res = false
                break
            }
        }
    }
    if (list.length) {
        res = false
    }
    return res
};