69.有效的括号(学习)
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([])”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
解析:
一、初始化
1.首先,我们定义了一个空栈 stack 用于存储左括号,以及一个映射 map 用于快速查找右括号对应的左括号。
二、遍历字符串
接下来,我们遍历输入字符串 s 中的每个字符。对于每个字符,我们执行以下操作:
1.检查是否为左括号
1.1.如果字符是 ‘(’、‘[’ 或 ‘{’ 之一,那么它是一个左括号。我们将它压入栈中,以便稍后找到匹配的右括号。
2.检查是否为右括号
2.1.如果字符是 ‘)’、‘]’ 或 ‘}’ 之一,那么它是一个右括号。此时,我们需要执行以下步骤来检查它是否与栈顶的左括号匹配:
2.1.1.检查栈是否为空:如果栈为空,说明没有左括号可以与当前的右括号匹配,因此字符串无效。
2.1.2.检查栈顶元素:如果栈不为空,我们取出栈顶元素(即最近压入的左括号),并检查它是否与当前的右括号匹配(通过 map 映射)。
2.1.2.1如果匹配,说明我们找到了一个有效的括号对,我们将栈顶的左括号弹出(即移除)。
2.1.2.2如果不匹配,说明当前的右括号没有对应的左括号,或者顺序不正确(例如,] 出现在 ( 之后),因此字符串无效。
3. 检查非法字符
3.1.虽然题目已经说明输入字符串只包含括号,但理论上我们可以添加一个检查来确保字符串中不包含其他非法字符。不过,在这个特定的问题中,这一步是可选的,因为我们已经通过前面的检查覆盖了所有可能的情况。
三、结束检查
遍历完字符串后,我们需要检查栈是否为空。
1.如果栈为空,说明所有的左括号都找到了匹配的右括号,并且顺序正确,因此字符串有效。
2.如果栈不为空,说明有未匹配的左括号,因此字符串无效。
var isValid = function (s) {
const stack = []; // 创建一个空栈
const map = {
')': '(',
']': '[',
'}': '{'
}; // 用于快速查找右括号对应的左括号
for (let char of s) {
if (['(', '[', '{'].includes(char)) {
// 如果是左括号,则压入栈中
stack.push(char);
} else if (char in map) {
// 如果是右括号,则检查栈顶元素是否匹配
const topElement = stack[stack.length - 1];
if (map[char] === topElement) {
// 如果匹配,则弹出栈顶元素
stack.pop();
} else {
// 如果不匹配,则字符串无效
return false;
}
} else {
// 如果字符既不是左括号也不是右括号,则字符串无效
return false;
}
}
// 如果栈为空,则字符串有效;否则,字符串无效
return stack.length === 0;
};