有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

构建一个栈,匹配字符串

switch 匹配

遍历字符串,如果是左括号就入栈,如果是右括号就和栈顶的元素匹配,不匹配则返回false

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  // 栈
  let stack = []
  let len = s.length
  // 有效字符串一定为偶数长度
  if (len % 2 !== 0) return false
  for (let i = 0; i < len; i++) {
    switch (s[i]) {
      case '(':
      case '[':
      case '{':
        stack.push(s[i])
        break;
      case ')':
        if (stack.pop() !== '(') return false
        break;
      case ']':
        if (stack.pop() !== '[') return false
        break;
      case '}':
        if (stack.pop() !== '{') return false
        break;
    }
  }
  return !stack.length
};

map优化

将 Switch 匹配替换成map 右括号为key 左括号为 value,左括号直接入栈,右括号判断是否和栈顶括号匹配

var isValid = function (s) {
  let len = s.length
  let stack = []
  if (len % 2 !== 0) return false
  // 优化Switch case
  const map = new Map([
    [')', '('],
    [']', '['],
    ['}', '{'],
  ])
  for (let i = 0; i < len; i++) {
    // 右侧括号
    if (map.get(s[i])) {
      // 右括号是否匹配栈顶元素
      if (map.get(s[i]) !== stack[stack.length - 1]) return false
      else stack.pop()
    } else {
      stack.push(s[i])
    }
  }
  return !stack.length
}
贡献者: huxiguo