Skip to content

Latest commit

 

History

History
128 lines (100 loc) · 2.02 KB

20.有效的括号.md

File metadata and controls

128 lines (100 loc) · 2.02 KB

题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:

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

通过数组,入栈左括号,遇到右括号进行switch匹配

var isValid = function(s) {
  let arr = []
  for (let i = 0; i < s.length; i++) {
    const char = s[i]
    if (char === '(' || char === '{' || char === '[') {
      arr.push(char)
      continue
    }

    switch (char) {
      case ')':
        if (arr[arr.length - 1] !== '(') {
          return false
        }

        arr.pop()
        break
      case '}':
        if (arr[arr.length - 1] !== '{') {
          return false
        }

        arr.pop()
        break
      case ']':
        if (arr[arr.length - 1] !== '[') {
          return false
        }

        arr.pop()
        break
    }
  }

  //栈不为空说明不成对
  return arr.length === 0 ? true : false
}

通过预存对象来映射左右括号的匹配,就可以不使用switch了

var isValid = function (s) {
  let match = {
    '{': '}',
    '[': ']',
    '(': ')',
  }

  let left = []
  for (let i = 0; i < s.length; i++) {
    const char = s[i]
    if (char === '(' || char === '{' || char === '[') {
      left.push(char)
    } else {
      if (match[left[left.length - 1]] !== char) {
        return false
      }

      left.pop()
    }
  }

  return left.length ? false : true
}

替换掉成对儿的括号,最终只剩下空字符串

var isValid = function (s) {
  while (s.includes('()') || s.includes('{}') || s.includes('[]')) {
    s = s.replace('()', '')
    s = s.replace('[]', '')
    s = s.replace('{}', '')
  }

  return s === ''
}