题目名称:有效括号序列
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
/**
* 解法一:栈
* 思路:
*(1)左括号,压栈
*(2)右括号,则判断栈顶是否匹配(是否出栈)否则直接 return false
* (3) 最后 return stack.length === 0
* 时间复杂度:O(n),其中 n 为字符串长度
* 空间复杂度:O(n),最坏情况下栈空间记录整个字符串长度的右括号
*/
function isMatch(left, right) {
if (
(left === "{" && right === "}") ||
(left === "[" && right === "]") ||
(left === "(" && right === ")")
)
return true;
return false;
}
function isValid(s) {
const len = s.length;
if (len === 0) return true;
const stack = [];
const leftSymbols = "{[(";
const rightSymbols = ")]}";
for (let i = 0; i < len; i++) {
const char = s[i];
if (leftSymbols.includes(char)) {
// 左括号,压栈
stack.push(char);
} else if (rightSymbols.includes(char)) {
// 右括号,判断栈顶(是否出栈)
const top = stack[stack.length - 1];
if (isMatch(top, char)) {
stack.pop();
} else {
return false;
}
}
}
return stack.length === 0;
}