HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

      • MySQL

      • 中间件

      • 算法

        • 1-两数之和
        • 高频算法面试题
        • 2两数相加
        • 09-用两个栈实现一个队列
        • 11-盛水最多的容器
        • 19-删除链表的倒数第N个结点
        • 20-有效的括号
        • 22-括号生成
        • 39-组合总和
        • 46-全排列
        • 53-连续最大子序和
        • 64匹马,只有8个赛道,挑选出最快的4匹马
        • 70-爬楼梯
        • 136-只出现一次的数字
        • 141环形链表
        • 206-翻转链表
        • 234回文链表
        • 387-字符串中的第一个唯一字符
        • 543二叉树最大直径
        • 八大排序算法
        • 剪绳子
        • 旋转数
        • 模板
        • 求解立方根不使用库函数
      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • 算法
#有效的括号
码农阿雨
2022-06-02
目录

20-有效的括号

# 描述

难度:简单

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

有效字符串需满足:

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

输入:s = "()"
输出:true
示例 2:

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

输入:s = "(]"
输出:false
示例 4:

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

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

提示:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-parentheses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# 思路

这种字符串类的题目,基本上99%都是要借助辅助栈、HashMap、list 来解决的。

有效括号,题目说:

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

同时符合这两个条件才能是有效括号,上面的示例4 就是不满足条件2。

  • 方法一

既然要求顺序一致,那可以尝试使用栈来解决:

  • 首先就是要循环遍历这个字符

     for (char c : s.toCharArray()) {
    
  • 遇到左括号类型({[(),我就把对应的右括号(}]))入栈。

if (c == '(') { //入栈 stack.push(')'); }


- 遇到右括号类型,我就**把栈顶弹出来**,如果当前位置和弹出来的括号是相同的,那就说明这一对是合法的,然后继续循环。

这里还有一个注意点,就是要判断空栈,如果是空栈,表示上一步都是没有入栈,出现的都是右括号类型,右括号开头的肯定就不是有效括号了,直接返回。

```java
if (stack.empty() || c != stack.pop()) {
	return false;
}
  • 最后就是判断这个栈是否为空,如果为空,表示括号都匹配完毕,否则就是存在有左括号类型,没有机会出栈和 c 比较。

# 题解

public class 有效的括号20 {
    public static void main(String[] args) {
//        简单理解就是左边出现了 {,右边一定要是 }
//        String s = "()[]{}";
//        String s ="([)]";
//        String s = "((";
//        String s ="({{[]}})";
//        String s ="((";
        String s = "))";
        System.out.println(isValid(s));
    }


    /**
     * O(n) 复杂度
     *
     * @param s
     * @return
     */
    static boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                //入栈
                stack.push(')');
            } else if (c == '{') {
                stack.push('}');
            } else if (c == '[') {
                stack.push(']');
                // ]、}、) 进入这个判断
            } else if (stack.empty() || c != stack.pop()) {
                return false;
            }
        }
        //如果栈有剩下,可以理解为表示基数或者[[[[(((这种情况
        if (!stack.empty()){
            return false;
        }
        return true;
    }
}
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#有效的括号
上次更新: 2026-03-28 17:00:16
最近更新
01
MySQL支持的锁有哪些
03-28
02
HTTP 是不保存状态的协议, 如何保存用户状态
03-28
03
用户态和内核态的区别
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2026 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式