一个字符串s可能包括{}() [] 三种括号
判断s是否是括号匹配的
如(a{b}c)匹配, 而{a(b 或 {a(b}c}就不匹配
这个题考的就是 栈
栈: 先进后出
api: push pop length
栈和数组有什么区别? 没有区别 不是一个概念的东西,
逻辑结构 VS 物理结构
栈 逻辑结构 。理论模型,不管如何实现,不受任何语言的限制
数组 物理结构,真实的功能实现,受限于编程语言
思路
遇到左括号就压栈 压栈的意思就是把括号push到数组的操作 这就叫压栈 或者 进栈
遇到右括号就判断栈顶,匹配则出栈
最后判断length是否为0
/**
* @description 括号匹配
*
*/
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 leftSymbols = '{[('
const rightSymbols = '}])'
for(let i = 0; i < length; i++){
const s= str[i]
if(leftSymbols.includes(s)){
// 左括号 压栈
stack.push(s)
} else if (rightSymbols.includes(s)){
// 右括号 判断 匹配然后出栈
const top = stack[stack.length - 1]
if(isMatch(top,s)){
stack.pop()
}else{
return false
}
}
}
return stack.length === 0
}
分析 : 时间复杂度O(n) 空间复杂度O(n)
空间复杂度O(n) 只有一个数组空间
时间复杂度O(n) 虽然用了includes() 但是我们的leftSymbols 是固定了 可以忽略不记
所以是O(n)