重温算法之有效的括号

简介: 这个题为什么借助栈会变得很容易呢,因为都是在利用栈先进先出的特点,然后匹配左右括号,如果只有其中之一则不满足,不满足的从栈里取出,剩下的就是满足条件的。

微信截图_20220531213200.png


一.题目介绍


1.题目来源


链接:LeetCode


2.题目


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

有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。  


示例 1:

输入:s = "()" 输出:true


示例 2:

输入:s = "()[]{}" 输出:true


示例 3:

输入:s = "(]" 输出:false


示例 4:

输入:s = "([)]" 输出:false


示例 5:

输入:s = "{[]}" 输出:true


二.具体实现


1.实现思路


使用栈并借用一个中间map储存原始数据及处理后的数据,当没有遇到闭括号前,将开括号保存到栈中,遇到闭括号时将栈顶的开括号取出,在map找对应的开括号比较循环完后检查栈,若还有元素当表示没有匹配上,则为false。


2.实现代码


1)自己的实现方式

private HashMap<Character, Character> map;
// 利用构造函数来初始化对应的符号
public Solution() {
    this.map = new HashMap<Character, Character>();
    this.map.put(')', '(');
    this.map.put('}', '{');
    this.map.put(']', '[');
}
public boolean isValid(String s) {
    if (s == null || s.length() ==0) return true;
    // 初始化 stack 保存开括号
    Stack<Character> stack = new Stack<>();
    // 将 String 转为 char[] 后循环
    // 在map中的闭括号  stack.pop() 比较 mapping.get(c)
    // 不在map中的开括号  stack.push()
    for (char c : s.toCharArray()){
        if (map.containsKey(c)){
            char topElement = stack.empty() ? '#' : stack.pop(); // 注意当以闭括号开始  "]}}[]" stack 是null 所以用三元运算符判断
            if( topElement != map.get(c) ) return false;
        }else{
            stack.push(c);
        }
    }
    return stack.isEmpty();
}
复制代码


2)题友的实现方式


1.特判:过滤空字符串


2.创建一个辅助栈


3.遍历,对每一个字符进行如下操作


4.若为左括号,则往栈中存放右括号


5.若为右括号,如果栈为空或者该右括号与取出的栈顶元素不一样,则返回false


6.返回栈是否为空的状态

微信截图_20220531214050.png


3.运行结果

微信截图_20220531214120.png

微信截图_20220531214145.png


三.题后思考


这个题为什么借助栈会变得很容易呢,因为都是在利用栈先进先出的特点,然后匹配左右括号,如果只有其中之一则不满足,不满足的从栈里取出,剩下的就是满足条件的。

目录
相关文章
|
5月前
|
算法 安全 Java
【算法训练-栈 一】【结构特性】有效的括号、最小栈(包含Min函数的栈)
【算法训练-栈 一】【结构特性】有效的括号、最小栈(包含Min函数的栈)
35 0
|
2月前
|
算法 安全 Java
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
22 0
|
5月前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 三】【回溯算法最佳实践】括号生成、复原IP地址
【算法训练-回溯算法 三】【回溯算法最佳实践】括号生成、复原IP地址
35 0
|
5月前
|
算法 容器
【算法训练营】栈合集(1) 剑指 Offer 31. 栈的压入、弹出序列 || 32. 最长有效括号 || 682. 棒球比赛 || 面试题 03.01. 三合一
【算法训练营】栈合集(1) 剑指 Offer 31. 栈的压入、弹出序列 || 32. 最长有效括号 || 682. 棒球比赛 || 面试题 03.01. 三合一
35 0
|
5月前
|
算法 编译器 索引
数据结构与算法基础-(5)---栈的应用-(1)括号匹配
数据结构与算法基础-(5)---栈的应用-(1)括号匹配
26 1
|
6月前
|
算法
代码随想录算法训练营第十一天 | LeetCode 20. 有效的括号、LeetCode 1047. 删除字符串中的所有相邻重复项、LeetCode 150. 逆波兰表达式求值
代码随想录算法训练营第十一天 | LeetCode 20. 有效的括号、LeetCode 1047. 删除字符串中的所有相邻重复项、LeetCode 150. 逆波兰表达式求值
38 0
|
6月前
|
算法
代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
|
8月前
|
算法 Java 程序员
【手绘算法】力扣 20 有效的括号(Valid Parentheses)
Hi,大家好,我是Tom。一个美术生转到Java开发的程序员。今天给大家分享的是力扣题第20题,有效的括号。在解题过程中,也会手写一些伪代码。当然,如果想要完整的源码的话,可以到我的个人主页简介中获取。 这道题呢比较简单,但是曾经成为B站的算法面试题,而且通过率只有44.5%。
56 0
|
9月前
|
存储 算法
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
|
10月前
|
存储 算法
力扣算法题之括号合闭
力扣算法题之括号合闭