该题的解题思路用到了数据结构栈的概念,请查看 栈
/**
* @description 判断一个字符串是否括号匹配
* @author lsr
*/
/**
* 判断是否括号匹配
* @param str str
* @returns boolean
*/
/**
* 判断左右括号是否匹配
* @param left 左括号
* @param right 右括号
* @returns boolean
*/
function isMatch(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
if (length === 0) return true
const leftBracket = '({['
const rightBracket = ')}]'
const stack = []
for (let i = 0; i < length; i++) {
const s = str[i]
if (leftBracket.includes(s)) {
// 入栈
stack.push(s)
} else if (rightBracket.includes(s)) {
// 右括号与栈顶匹配,则出栈
const top = stack[stack.length - 1]
if (isMatch(top, s)) {
stack.pop()
} else {
return false
}
}
}
return stack.length === 0
}
// 功能测试
console.log(matchBracket('(a[b{c}d]e)f)'))
单元测试
/**
* @description 判断是否括号匹配 test
* @author lsr
*/
import { matchBracket } from '@/01-algorithm/match-bracket'
describe('判断是否括号匹配', () => {
it('正常情况', () => {
const str = '(a{b[c]d}e)'
const res = matchBracket(str)
expect(res).toBeTruthy()
})
it('顺序不匹配', () => {
const str = '(a[b{c]d}e)'
const res = matchBracket(str)
expect(res).toBeFalsy()
})
it('个数不匹配', () => {
const str1 = '(ab{c}d]e)'
const str2 = '(a[b{c}}d]e)'
const str3 = 'abc}d]e)'
const str4 = '(a[b{c}d]e)f)'
const res1 = matchBracket(str1)
expect(res1).toBeFalsy()
const res2 = matchBracket(str2)
expect(res2).toBeFalsy()
const res3 = matchBracket(str3)
expect(res3).toBeFalsy()
const res4 = matchBracket(str4)
expect(res4).toBeFalsy()
})
it('没有括号', () => {
const str = 'abcde'
const res = matchBracket(str)
expect(res).toBeTruthy()
})
})
复杂度分析
- 时间复杂度O(n)
- 空间复杂度O(n)
划重点
- 栈
- 逻辑结构 vs 物理结构