判断字符串是否括号匹配
题目:
一个字符串可能包含{}()[]三种括号,判断该字符串是否括号匹配。如:(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) }) })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!