给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
解法
用一个 stack 维护左括号,遍历 s,当发现s[i] 为 左括号时,将其入栈,让发现s[i]为右括号时,判断栈顶是否为与之匹配的左括号,是则出栈,否则不是有效的括号。当遍历结束的时候,判断 stack 的长度,长度为 0 则是有效的括号。
ts
function isValid(s: string): boolean {
const stack:string[] = [],len = s.length
const pairs = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
for(let i = 0; i < len ; i++) {
let item = s[i]
const top = stack[stack.length - 1]
if (!pairs.has(item)) {
stack.push(item)
} else {
if (top !== pairs.get(item))
return false
else {
stack.pop()
}
}
}
return stack.length === 0
};
时间复杂度O(n),空间复杂度O(n)