- 题目
给定一个只包括 ‘(’ ,’)’ ,’{’ ,’}’ ,’[’ ,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
复制代码
示例 2:
输入: “()[]{}”
输出: true
复制代码
示例 3:
输入: “(]”
输出: false
复制代码
示例 4:
输入: “([)]”
输出: false
复制代码
示例 5:
输入: “{[]}”
输出: true
解法:
使用栈
let aa = '()[]{}'
let bb = '([])'
let cc = '([{}])}'
function isYouxiaoSymbol (str) {
if (str === '') {
return true
}
let symbol = {
'(' : ')',
'[' : ']',
'{' : '}',
}
let stack = []
for(let i=0; i<str.length; i++) {
// [].pop 空数组pop返回一个undefined值
let keys = Object.keys(symbol)
if (keys.includes(str[i])) { // 左括号入栈
stack.push(str[i])
} else {
if (symbol[stack.pop()] !== str[i]) { // 右括号比较出栈
return false
}
}
}
return stack.length === 0
}
console.log(isYouxiaoSymbol(aa))
console.log(isYouxiaoSymbol(bb))
console.log(isYouxiaoSymbol(cc))
时间复杂度 o(n)
空间复杂度 o(n)