前言
今天我们做一道面试经典的算法题目,判断一个数组中的括号是否都闭合
输入一个全为字符串,判断里面的括号都是否匹配,如果元素都匹配返回true,如果元素都不匹配,则返回false
样例输出
请看示例1:
输入: str = '{a(b[c]d)e}f'
输出: true
请看示例2:str = {a(b[c]d}e)f
输出: false
解题思路
使用数组创建一个栈,遇到左括号就压栈,右括号就出栈,最后判断,栈中的元素长度是否为零
代码实现
function isMatch(left:string, right:string):boolean {
if (left === '{' && right === '}') return true
if (left === '[' && right === ']') return true
if (left === '(' && right === ')') return true
return false
}
export function matchBracket(str:string):boolean {
let length = str.length
let leftSymbols = '{[('
let rightSymbols = '}])'
let stack = []
for (let i = 0;i < length; i++) {
const n = str[i]
if (leftSymbols.includes(n)) {
stack.push(n)
} else if (rightSymbols.includes(n)) {
const top = stack[stack.length - 1]
if (isMatch(top, n)) {
stack.pop()
} else {
return false
}
}
}
return stack.length === 0
}
单元测试
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)
})
})