Skip to content

LeetCode:20. 有效的括号

解析思路-用栈来实现

  • 遇到左括号 {([ 就压入栈
  • 遇到右括号 })] 就判断栈顶,匹配泽出栈
  • 最后判断 length 是否为 0

代码实现

ts
/**
 * @desc 括号匹配
 * @author lzw.
 */

function isMatch(left: string, right: string): boolean {
  if (left === '(' && right === ')') return true
  if (left === '{' && right === '}') return true
  if (left === '[' && right === ']') return true
  return false
}

function matchBracket(str: string): boolean {
  const length = str.length
  if (length === 0) return true

  const stack = []
  const leftBracket = '{(['
  const rightBracket = '})]'

  for (let i = 0; i < length; i++) {
    const s = str[i]
    // 左括号,压栈
    if (leftBracket.includes(s)) {
      stack.push(s)
    }
    if (rightBracket.includes(s)) {
      const top = stack[stack.length - 1]
      // 是否匹配,出栈
      if (isMatch(top, s)) {
        stack.pop()
      } else {
        return false
      }
    }
  }

  return stack.length === 0
}

// 测试用例 - jest
describe('括号匹配', () => {
  it('正常情况', () => {       
    expect(matchBracket('{a(b[c]d)e}f')).toBe(true)
  })
});

describe('括号匹配', () => {
  it('错误情况', () => {
    expect(matchBracket('{a(b[c]de}f)')).toBe(false)
  })
});

describe('括号匹配', () => {
  it('空', () => {
    expect(matchBracket('')).toBe(true)
  })
});

性能分析

  • 时间复杂度和空间复杂度都是 O(n)

基于 MIT 许可发布