155-data_structure-15-map~20有效的括号

155-data_structure-15-map~20有效的括号

概述

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

有效字符串需满足:

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

测试

输入:s = "()"
输出:true

输入:s = "()[]{}"
输出:true

输入:s = "(]"
输出:false

输入:s = "([)]"
输出:false

输入:s = "{[]}"
输出:true

解题思路

{[()]}

1、需要遍历所有字符串

2、遇到左括号先略过,遇到右括号开始匹配,匹配的是最后遇到的左括号

3、后进先出模式,左括号逐一入栈,若遇到右括号,则取栈顶元素左括号

4、使用map优化

解题步骤

1、新建一个栈
2、扫描字符串,遇左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定为不合法
3、最后栈空了就合法,否则不合法

4、使用map判断是否为左括号或右括号

代码

/**
 * @param {string} s
 * @return {boolean}
 */
 var isValid = function(s) {
  if (s.length % 2 === 1) {
    return false
  }
  const stack = []
  const map = new Map()
  map.set('(', ')')
  map.set('[', ']')
  map.set('{', '}')
  for (const value of s) {
    if ( map.has(value) ) {
      stack.push(value)
    }else {
      const stack_top = stack[stack.length-1]
      if ( map.get(stack_top) === value ) {
        stack.pop()
      }else {
        return false
      }
    }
  }
  return stack.length === 0
};

复杂度

  • 时间复杂度:O(n),其中 n是字符串 s 的长度。
  • 空间复杂度:O(n),其中 n是临时存储 stack 的长度。

总结

1、栈适合解决对称类问题

2、先分析不合理情况,若存在,则提前返回

3、map建立映射关系,取键值对的值

推荐阅读

代码随想录