判断字符串是否括号匹配

题目:

  一个字符串可能包含{}()[]三种括号,判断该字符串是否括号匹配。如:(a{b}c)匹配的 ;{a(b 和 {a(b)c) 不匹配

思路:

  •  该题考查的是--栈 
    •  栈是一种逻辑结构,一种理论模型。可以脱离编程语言单独讲
    • 栈是先进后出。可以用数组、链表来表达,也可自定义calss Stack{} 实现。
    • 在JS中,栈一般情况用数组来实现
  • 遇到左括号 {、(、[ 就压栈
  • 遇到由括号 } 、)、] 则判断和栈顶元素是否相同,相同则出栈,不相同返回false,即不匹配
  • 最后判断栈的长度是否为0,不为0则还有未匹配的,返回false。否则返回true

代码实现:

复制代码
/**
 * @description 括号匹配
 * @author ykk
 */

export function isMath(left:string,right:string){
    if(left === '{' && right === '}') return true
    if(left === '(' && right === ')') return true
    if(left === '[' && right === ']') return true
    return false
}
export function matchBracket(str: string): boolean {
    const length = str.length
    console.log(length,'222')
    if(length === 0){
        return true
    }
    const stack:string[] = []
   
    const leftSymbol = '{[('
    const rightSymbol = "}])"
// 时间复杂度: O(n) for(let i = 0; i < length; i++){ const s = str[i]
      // includes 虽然也是O(n),但我们这里s是一个常数固定的,与n没有关系
if(leftSymbol.includes(s)){ //左括号 console.log(s,stack,'stack') stack.push(s) //压栈 } if(rightSymbol.includes(s)){ //右括号 // 根栈顶中括号比较,不想等循环结束,返回false const top = stack.pop() if(!top || !isMath(top ,s)){ return false } } } return stack.length === 0 }
复制代码

 

复杂度  

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

测试用例

复制代码
/**
 * @description 括号匹配
 * @author ykk
 */
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)
    })
    
})
复制代码

 

posted @   yangkangkang  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示