100道前端面试题(九): 判断字符串括号是否匹配(TS)

255 阅读1分钟

前言

9-1.webp

今天我们做一道面试经典的算法题目,判断一个数组中的括号是否都闭合


输入一个全为字符串,判断里面的括号都是否匹配,如果元素都匹配返回true,如果元素都不匹配,则返回false

样例输出

请看示例1:

输入: str = '{a(b[c]d)e}f'

输出: true

请看示例2:str = {a(b[c]d}e)f

输出: false

解题思路

使用数组创建一个栈,遇到左括号就压栈,右括号就出栈,最后判断,栈中的元素长度是否为零

代码实现

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

export function matchBracket(str:string):boolean {
      let length = str.length
      
      let leftSymbols = '{[('
      let rightSymbols = '}])'
      

      let stack = []

      for (let i = 0;i < length; i++) {
           const n = str[i]
           if (leftSymbols.includes(n)) {
               stack.push(n)
           }   else if (rightSymbols.includes(n)) {
               const top = stack[stack.length - 1]
               if (isMatch(top, n)) {
                stack.pop()
               } else {
                   return false
               }
               
           }
      }

      return stack.length === 0
}


单元测试


import { matchBracket } from './match-bracket'

describe('括号匹配', () => {
    it('正常情况', () => {
        const str = '{a(b[c]d)e}f'
        const res = matchBracket(str)
        expect(res).toBe(true)
    })

    it('不匹配', () => {
        const str = '{a(b[(c]d)e}f'
        const res = matchBracket(str)
        expect(res).toBe(false)
    })

    it('顺序不一致的', () => {
        const str = '{a(b[c]d}e)f'
        const res = matchBracket(str)
        expect(res).toBe(false)
    })

    it('空字符串', () => {
        const res = matchBracket('')
        expect(res).toBe(true)
    })
})