leetcode每天一题:【有效的括号 】(简单)

184 阅读2分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

给一个字符串,里面只包含(,),{,},[,]这六种字符,然后需要你判断字符串是否是有效的括号,也就是是否以同种类型按照顺序闭合的

如果是,则返回true, 否则返回false

举个例子:

字符串: '[]'
返回: true

字符串: '[)]'
返回: false

字符串: '([)]'
返回: false

字符串: '[()]'
返回: true

字符串: '(){}[]'
返回: true

字符串: '[{}]()'
返回: true

思路分析

这道题起码有三种类型:

  • 嵌套闭合的 [()]
  • 同级闭合的 []{}
  • 嵌套和同级组合闭合的 [{}]()

所以有很多种情况需要考虑。 之前我写的只是考虑的嵌套闭合这种情况,所以提交的时候会报错。然后我又加上同级闭合的情况,以为会成功了。但是还有嵌套和同级组合闭合的情况。

附上只考虑嵌套闭合和同级闭合的情况,没有考虑组合闭合的代码:

var isValid = function (s) {
  const mapping = {
    '(': ')',
    '{': '}',
    '[': ']'
  }
  if (s.length % 2 === 1) return false
  const len = s.length
  if (mapping[s[0]] === s[1]) {
    for (let i = 0; i <= len - 2; i = i + 2) {
      const s1 = mapping[s[i]]
      console.log(i, s[i], s1)
      if (s1) {
        if (s1 !== s[i + 1]) {
          return false
        }
      } else {
        return false
      }
    }
  } else {
    for (let i = 0; i < len / 2; i++) {
      const s1 = mapping[s[i]]
      console.log(s1)
      if (s1) {
        if (s1 !== s[len - i - 1]) {
          return false
        }
      } else {
        return false
      }
    }

  }
  return true
};

针对上面的问题,因为各个情况有点多,有点考虑不过来,所以得换个思路去解决问题。

我们分析它们的规律可以得到,从内部去掉闭合的字符串,下一对肯定也是闭合的字符串,直至最外层。

如果不是,则证明不是有效的括号。

我们可以使用对象来存储映射关系,左括号为key,右括号为value,

另外再用一个新数组来存储右括号。

遍历字符串,通过对象来判断是不是左括号,如果是,则把对应的右括号存到数组中。否则,则证明是当前是右括号,需要判断数组最后一个值是不是和它相等

如果不相等,则证明不是有效的括号。

如果相等,则把数组最后一个值删除,继续遍历。

遍历结束后,如果是有效的括号则数组的长度应该是0。如果大于0则证明是未闭合的。

代码如下:

var isValid = function (s) {
  if (s.length % 2 === 1) return false
  const mapping = {
    '(': ')',
    '{': '}',
    '[': ']'
  }
  const arr = []
  for (let i = 0; i < s.length; i++) {
    if (mapping[s[i]]) {
      arr.push(mapping[s[i]])
    } else {
      if (!arr.length || arr[arr.length - 1] !== s[i]) {
        return false
      }
      arr.pop()
    }
  }
  console.log(arr)
  return arr.length === 0
};

image.png