1. 题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'[',']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
- 1 <= s.length <= 104
- s 仅由括号
'()[]{}'
组成
2. 解法一: 栈
思路:新建一个栈,遇到左括号就入栈,遇到与之相同的就出栈直到最后判断栈是否为空
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
const l = s.length;
if (l % 2 === 1) return false;
const stack = [];
for (let i = 0; i < l; i++) {
const c = s[i];
if (["(", "[", "{"].includes(c)) {
stack.push(s[i]);
} else if (c === ")") {
if (stack.pop() !== "(") return false;
} else if (c === "]") {
if (stack.pop() !== "[") return false;
} else if (c === "}") {
if (stack.pop() !== "{") return false;
}
}
return stack.length === 0;
};
复杂度分析:
- 时间复杂度: O(n)
- 空间复杂度: O(n)
3. 解二: 使用Map更优雅
var isValid = function (s) {
const l = s.length;
if (l % 2 === 1) return false;
const stack = [];
const map = new Map();
map.set("(", ")");
map.set("[", "]");
map.set("{", "}");
for (let i = 0; i < l; i++) {
if (map.has(s[i])) stack.push(s[i]);
else if (!map.has(s[i]) && s[i] !== map.get(stack.pop())) return false;
}
return stack.length === 0;
};