020.有效的括号


2019-08-06

描述

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

有效字符串需满足:

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

示例 1:

输入: "()" 输出: true

示例 2:

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

示例 3:

输入: "(]" 输出: false

示例 4:

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

示例 5:

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

思路

  1. 利用栈的先进后出特点
  2. 遍历每一个字符,如果与栈顶元素匹配,则出栈不匹配则进栈;最后为空栈说明是合法的。

如果遇到开括号,我们只需将其推到栈上即可。如果遇到一个闭括号,检查栈顶的元素是一个相同类型的左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。 如果到最后我们剩下的栈中仍然有元素,那么这意味着括号不是有效的

代码

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
  let map = {
    '[': ']',
    '(': ')',
    '{': '}'
  }
  let arr = s.split('')
  let stack = []
  for (let i = 0; i < arr.length; i++) {
    if (map[stack[stack.length - 1]] === arr[i]) {
      stack.pop()
    } else {
      stack.push(arr[i])
    }
  }
  if (stack.length == 0) {
    return true
  }
  return false
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

'()[]{}' 例子来说明,初始化时 stack 为 []

第一次 ( 入栈,stack 为 ['('], 第二次 ) 入栈,与栈顶元素进行比较,即 stack[stack.length - 1],发现能在 map 中匹配上,则将 ( 出栈,stack 为 []

如果不能匹配,比如是 ],则入栈,即 stack 为 ['(',']'],继续循环

直到 stack 中是空数组,说明输入的括号是有效的,如果还有值,则说明无效

测试

test('有效的括号', () => {
  expect(isValid('()')).toBe(true)
  expect(isValid('()[]{}')).toBe(true)
  expect(isValid('(]')).toBe(false)
  expect(isValid('([)]')).toBe(false)
  expect(isValid('{[]}')).toBe(true)
})
1
2
3
4
5
6
7