判断括号字符串是否有效
使用栈数据结构判断字符串中的括号是否匹配有效,支持多种括号类型
问题
给定一个只包含括号字符的字符串,判断该字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
- 支持三种括号类型:
()、[]、{}
例如:
"()"→ 有效"()[]{}"→ 有效"(]"→ 无效"([)]"→ 无效"{[]}"→ 有效
解答
/**
* 判断括号字符串是否有效
* @param {string} s - 待检测的括号字符串
* @return {boolean} - 是否有效
*/
function isValidBrackets(s) {
// 空字符串视为有效
if (!s) return true;
// 奇数长度的字符串一定无效
if (s.length % 2 !== 0) return false;
// 括号映射表
const map = {
')': '(',
']': '[',
'}': '{'
};
// 使用栈存储左括号
const stack = [];
for (let char of s) {
// 如果是右括号
if (map[char]) {
// 栈为空或栈顶元素不匹配,返回 false
if (!stack.length || stack[stack.length - 1] !== map[char]) {
return false;
}
// 匹配成功,弹出栈顶元素
stack.pop();
} else {
// 如果是左括号,入栈
stack.push(char);
}
}
// 栈为空说明所有括号都匹配成功
return stack.length === 0;
}
使用示例
// 测试用例
console.log(isValidBrackets("()")); // true
console.log(isValidBrackets("()[]{}")); // true
console.log(isValidBrackets("{[]}")); // true
console.log(isValidBrackets("(]")); // false
console.log(isValidBrackets("([)]")); // false
console.log(isValidBrackets("{[}]")); // false
console.log(isValidBrackets("")); // true
console.log(isValidBrackets("((")); // false
console.log(isValidBrackets("(()())")); // true
console.log(isValidBrackets("({[]})")); // true
// 边界情况测试
console.log(isValidBrackets("(")); // false - 单个左括号
console.log(isValidBrackets(")")); // false - 单个右括号
console.log(isValidBrackets(")(")); // false - 顺序错误
关键点
-
栈数据结构:利用栈的后进先出(LIFO)特性,完美匹配括号的嵌套关系
-
哈希映射:使用对象存储右括号到左括号的映射关系,快速判断括号类型和匹配
-
遍历策略:
- 遇到左括号
(、[、{时入栈 - 遇到右括号时检查栈顶是否为对应的左括号
- 遇到左括号
-
边界处理:
- 空字符串返回
true - 奇数长度字符串直接返回
false(优化性能) - 遍历结束后检查栈是否为空
- 空字符串返回
-
时间复杂度:O(n),需要遍历字符串一次
-
空间复杂度:O(n),最坏情况下所有字符都是左括号需要入栈
目录