题目
- 一个字符串 s 可能包含 { } ( ) [ ] 三种括号
- 判断 s 是否是括号匹配的
- 如(a{b}c) 匹配,而 {a(b 或 {a(b}c) 不匹配
栈
- 先进后出
- API: push pop length
- 相关的:队列、堆
栈和数组的关系或区别
栈是一种逻辑结构,理论模型,不管如何实现,都不受任何语言的限制。
数组是一个物理结构,真实的功能实现,受限于编程语言。
解题思路
- 遇到左括号 ( [ { 就压入栈
- 遇到右括号 } ] ) 就判断栈顶,匹配则出栈
- 最后判断 length 是否为 0
时间复杂度 O(n) 空间复杂度 O(n)
match-bracket.ts
// 括号匹配
// 判断左右括号是否匹配
function isMatch(left: string, right: string) {
if(left === '{' && right === '}') return true
if(left === '[' && right === ']') return true
if(left === '(' && right === ')') return true
}
export function matchbracket(str: string): boolean {
const length = str.length
if (length === 0) return true
const stack = []
// includes 固定的长度和数据量无关
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
}
match-bracket.test.ts
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(true)
})
it('顺序不一致', () => {
const str = '{a(b[(c]d}e)f'
const res = matchBracket(str)
expect(res).toBe(true)
})
it('空字符串', () => {
const str = ''
const res = matchBracket(str)
expect(res).toBe(true)
})
})