「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
示例 4:
输入: s = "([)]"
输出: false
示例 5:
输入: s = "{[]}"
输出: true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
本题要我们判断输入字符串中的括号是否都一一对应
那么我们就需要在遇到右括号的时候,判断它前面是否是与之对应的左括号
如果不是,返回 false
但是这里有一个问题,就是当前括号对比成功后,如何不妨碍后续的括号对比,也就是每一个后面的字符,如何找到前面与之对应的字符的位置
这里我们可以用栈来维护所有的左括号,当遇到左括号,入栈
当遇到右括号的时候,此时栈顶字符就是与之对应的字符,判断两个字符是否是对应括号,如果不是,返回 false,否则将栈顶元素弹出,这样就保证了后续有括号遍历到的时候,栈顶元素还是与之对应的字符
解题思路如下:
- 创建一个栈,用来后续存储所有的左括号
- 为了不针对每一种右括号做一次判断逻辑代码编写,创建一个
obj维护括号之间的对应关系 - 遍历字符串,如果当前字符为左括号,将该字符入栈
- 如果当前字符为右括号,判断栈顶元素是否是与之对应的左括号,如果不是,返回
false,否则将栈顶元素弹出,方便后续对比 - 如果字符串顺利遍历完成,说明所有的右括号都恰好有与之对应的做括号
- 最后判断栈是否为空,如果不为空,说明有多余的左括号,返回
false,否则说明左右括号完全一一对应,返回true
代码如下:
var isValid = function(s) {
// 创建栈存储左括号
const stack = [],
// 利用obj维护对应关系
obj = {
')':'(',
']':'[',
'}':'{'
}
// 遍历字符串
for(let i = 0;i<s.length;i++){
switch(s[i]){
// 如果为左括号,入栈
case '(':
case '[':
case '{':
stack.push(s[i])
break;
// 如果为右括号,判断当前栈顶字符是否是其对应左括号,如果不是,返回 false
case ')':
case ']':
case '}':
if(stack.length === 0 || stack.pop() !== obj[s[i]]) return false;
break;
}
}
// 代码来到这里遍历过程中所有右括号都匹配到了对应的左括号
// 此时如果栈为不为空,说明左括号存在多余情况,反之说明输入字符串有效
return stack.length === 0
};
至此,我们就完成了leetcode-20-有效的括号
如有任何问题或建议,欢迎留言讨论!