3判断一个字符串的括号是否成对匹配

Posted 天界程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3判断一个字符串的括号是否成对匹配相关的知识,希望对你有一定的参考价值。

判断一个字符串的括号是否成对匹配

  • 一个字符串str可能包含 ()[] 三种括号
  • 判断 str 是否是括号成对匹配
  • 如 (abc)匹配,而 a(b 或者 a(bc)就不匹配

了解栈

  • 先进后出
  • API:push pop length
  • 相关的:队列,堆

逻辑结构 VS 物理结构

  • 栈 VS 数组
  • 栈:逻辑结构。理论模型,不管如何实现,不受任何语言的限制
  • 数组:物理结构。真实的功能实现,受限于编程语言

数组可以实现栈,栈是一个抽象的模型,栈实现不了数组

解题思路

  • 遇到左括号 ([ 就压栈(入栈)
  • 遇到右括号)] 就判断栈顶,匹配则出栈,不匹配这直接返回false
  • 最后判断length是否为0,是则返回true,反之false

代码实现功能

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

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

  for ( let i = 0; i < len; i++) 
    const s = str[i]
    if (leftBracket.includes(s)) 
      // 左括号压栈
      stack.push(s)
     else if (rightBracket.includes(s)) 
      // 获取左括号的栈顶元素
      const top = stack[stack.length -1]
      if (
        (top === '(' && s === ')') ||
        (top === '' && s === '') || 
        (top === '[' && s === ']')
      ) 
        // 右括号出栈
        stack.pop()
       else 
        // 不成对匹配,匹配失败
        return false;
      
    
  
  return stack.length === 0

功能测试

const res1 = matchBracket('(abc)')
const res2 = matchBracket('(ab)c]')
const res3 = matchBracket('(ab')
const res4 = matchBracket('')
console.log(res1) // true
console.log(res2) // false
console.log(res3) // true
console.log(res4) // true

功能基本实现。

单元测试

describe('括号匹配', () => 
    it('正常情况', () => 
        const str = '(abc)'
        const res = matchBracket(str)
        expect(res).toBe(true)
    )
    
    it('不匹配情况', () => 
        const str = '(ab)c]'
        const res = matchBracket(str)
        expect(res).toBe(true)
    )
    
    it('字符串为空的情况', () => 
        const str = ''
        const res = matchBracket(str)
        expect(res).toBe(true)
    )
)

性能分析

  • 时间复杂度O(n)
  • 空间复杂度O(n)

对于时间复杂度:关于includes这个API来说,它的时间复杂度是O(n), 但是在这里只用了3个固定的字符来使用这个API,计算量可以算为常量级别。

对于空间复杂度:这里新建了一个数组,它的长度大小和字符串里面包含的左括号成正比,所以在这里它的空间复杂度是O(n)数量级。

以上是关于3判断一个字符串的括号是否成对匹配的主要内容,如果未能解决你的问题,请参考以下文章

用栈实现括号匹配的检验

判断字符串中的括号是否成对出现

栈的应用-判断括号匹配

判断花括号是否成对出现

java 实例 判断输出的括号是否成对出现

括号匹配