【切图仔的算法修炼之旅】LeetCode20:有效的括号

简介: 【切图仔的算法修炼之旅】LeetCode20:有效的括号

一、题目描述


给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。


有效字符串需满足:


左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。


示例1:


输入: s = "()"
输出: true
复制代码


示例2:


输入: s = "()[]{}"
输出: true
复制代码


示例3:


输入: s = "(]"
输出: false
复制代码


示例4:


输入: s = "([)]"
复制代码


示例5:


输入: s = "{[]}"
输出: true
复制代码


提示:


  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成


二、思路分析


这题是典型的堆栈问题,我们应该使用栈解决这个问题。


  1. 首先我们需要借助Map数据结构存储每一对括号。


dc4064dd766b44c9bc412d987b468f7b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  1. 初始化一个空栈,接着循环字符串,如果遇到左括号,我们则需要该左括号推(push)入栈中。


  1. 如果遇到右括号,首先需要判断栈是否为空,以及栈顶元素是否是该右括号对应的左括号(这时候Map数据结构就派上用场了),若栈为空,则说明左右括号数量不一致,返回false。若栈顶元素不为对应括号,说明左右括号不匹配,返回false。


  1. 剩下的情况那就肯定匹配正确,我们需要弹出栈顶(pop)元素。


  1. 最后返回结果,true or false,我们通过判断栈是否为空即可,若栈为空,则括号有效,反之无效。


三、AC代码


/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let stack = [];
    let map = new Map([
        ["}","{"],
        [")","("],
        ["]","["],
    ])
    for (let str of s) {
        if (!map.has(str)) {
            stack.push(str)
        } else {
            if (!stack.length || stack[stack.length-1] !== map.get(str)) {
                return false
            }
            stack.pop()
        }
    }
    return !stack.length;
};
复制代码


四、总结


这题经常出现在面试中,非常经典,可以很好地考察面试者对栈这种数据结构的掌握程度,因此要熟练掌握这道题的精髓所在。

相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
10天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
23 2
|
1月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
16 0
Leetcode第二十二题(括号生成)
|
1月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
16 0
|
3月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
3月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
51 6
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
59 1