有效的括号(简单难度,常考的好题目)

简介: 有效的括号(简单难度,常考的好题目)

题目概述(简单难度)

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


有效字符串需满足:


1:左括号必须用相同类型的右括号闭合。

2:左括号必须以正确的顺序闭合。


示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

题目链接:

点击我进入leetcode


思路与代码

思路展现

字符串无效无非就一下三种情况:


1:左括号多

2:右括号多

3:左右括号不匹配


这道题目大多数同学会第一时间想到栈,这个思路非常的正确,这道题目的思路是这样的

1:首先定义一个变量i去遍历我们字符串中的括号,当遇到左括号的时候就将左括号入栈,然后i继续向后遍历

2:当i遍历到右括号的时候,就将此时栈顶的左括号出栈,然后判断栈顶的这个左括号与i遍历到的右括号是否匹配,如果匹配i继续往下遍历,并将这个左括号弹出栈,否则返回false

3:当按照2中的方法遍历字符串中的每个括号时,此时会出现三种情况:

(1):当遍历完字符串中每个括号,发现栈中此时不包含任何左括号,说明是有效字符串,返回true.

(2):当遍历完字符串中每个括号,栈中此时还有左括号,说明左括号肯定多了.则返回false

(3):当遍历字符串中每个括号的过程还没有完成时,栈中的突然发现栈中的左括号已经没有了,就说明右括号多了.


代码示例

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i = 0;i < s.length();i++) {
            char ch = s.charAt(i);
            if(ch == '(' || ch == '[' || ch == '{') {
                //说明当前遍历到的字符是左括号
                stack.push(ch);
            }else {
                //1、判断当前的栈是否是空的
                if(stack.empty()) {
                    System.out.println("此时栈为空,但是还是走到这里,说明右括号多了");
                    return false;//代表右括号多
                }
                //2、拿到栈顶元素,看栈顶元素是否和当前的字符匹配,如果匹配当前栈顶元素出栈
                char topch = stack.peek();
                if(topch == '{' && ch == '}' || topch == '[' && ch == ']' || topch == '(' && ch == ')') {
                    stack.pop();
                }else{
                    System.out.println("左右括号不匹配");
                    return false;//代表左右括号不匹配
                }
            }
        }
        if(!stack.empty()) {
            System.out.println("左括号多");
            return false;//代表左括号多
        }
        return true;
    }
}

总结

考察对于栈的掌握


相关文章
|
9月前
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
285 0
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
移动开发 前端开发 JavaScript
React框架
React是一个用于构建用户界面的JavaScript库,由Facebook开发并于2013年开源,目前在前端开发领域得到了广泛的应用。
|
数据采集 存储 供应链
数据对账的目的是什么?
数据对账的目的是什么?
632 2
|
存储 前端开发 数据可视化
超详细图解说明:一个代码仓库如何管理多个项目、且代码提交互不影响。orphan分支的使用
这篇文章详细图解了如何使用Git的`--orphan`参数创建孤立分支来管理代码仓库中的多个项目,确保不同项目的代码提交互不影响,并提供了解决实际使用中可能遇到的问题的方法。
超详细图解说明:一个代码仓库如何管理多个项目、且代码提交互不影响。orphan分支的使用
|
Java Spring
spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
525 0
|
测试技术
详解单元测试问题之@InjectMocks注入mock对象如何解决
详解单元测试问题之@InjectMocks注入mock对象如何解决
1099 1
|
存储 监控 供应链
账单系统-架构设计思路(对外版)
阿里商旅背景阿里商旅作为飞猪旅行旗下面向企业客户的数字化差旅解决方案产品,依托飞猪旅行机票、酒店供应链,为企业客户提供一站式的机票、酒店、火车票、用车等预订管控及结算票据服务。阿里商旅不仅是集团欢行的供应商,而且近几年在商业化差旅市场上崭露头角,服务了2万+中大型客户,43万+小微企业。FY22财年商旅技术团队重点规划在酒店供应链、预订管控服务、B+C客户服务、渠道及商旅基础建设等核心方向进行建设
5309 2
账单系统-架构设计思路(对外版)
|
Kubernetes API Docker
kubernetes Operator 【2】实战CRD编程
kubernetes Operator 【2】实战CRD编程
kubernetes Operator 【2】实战CRD编程
Visual paradigm社区版下载及中文菜单的设置
Visual paradigm社区版下载及中文菜单的设置
695 0