有效的括号(Java笔试)

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

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


注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"

输出: true

示例 2:

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


示例 3:

输入: "(]"
输出: false


示例 4:

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


示例 5:

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

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

 

解题思路:

运用栈的方法,每次往栈中新增元素的时候,从栈底往栈顶增长,先来的元素在栈底,后来的元素在栈顶,先出去的元素是栈顶元素,栈底元素最后才能出去,遍历字符串依次取出每个字符:

如果当前字符是左括号(   [    {,就把当前的字符入栈
如果当前字符是右括号,取出栈顶元素,看看栈顶元素和当前括号类型是否匹配;如果类型匹配,把栈顶元素出栈,继续取下一个字符;如果类型不匹配,直接判定成非法,返回 false
遍历完整个字符串,看栈中的内容是否为空;空栈就说明合法,否则就是非法
有了栈就能帮我们处理好,多层括号嵌套的情况

代码实现

import java.util.Stack;
public class Solution {
    public boolean isValid(String s) {
        //先创建一个类
        Stack<Character> stack = new Stack<>();
        //循环遍历字符串中的每个字符
        for (int i = 0;i <s.length();i++){
            char c = s.charAt(i);
            //判定 c 是否是左括号,如果是左括号就入栈
            if (c == '(' || c == '[' || c == '{'){
                stack.push(c);
                //进入下次循环,取出下一个字符
                continue;
            }
            if (stack.empty()){
                //如果发现当前字符不是左括号,并且栈为空,说明字符串违法
                //这种情况说明前面没有合适的左括号和当前括号匹配
                return false;
            }
            //判定 c 是否是右括号,如果是,就取出栈顶元素进行对比
            char top = stack.pop();
            if (top == '(' && c == ')'){
                continue;
            }
            if (top == '[' && c == ']'){
                continue;
            }
            if (top == '{' && c == '}'){
                continue;
            }
            //除了上面的三种合法情况,剩下的都是非法的
            return false;
        }
        //遍历完字符串后看栈是否为空
        if (stack.empty()){
            return true;
        }
        return false;
    }
}


还可以用 Map 来优化代码

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
 
public class Solution_2 {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        Map<Character,Character> map = new HashMap<>();
        map.put('(',')');
        map.put('{','}');
        map.put('[',']');
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '{' || c== '['){
                stack.push(c);
                continue;
            }
            if (stack.empty()){
                return false;
            }
            char top =  stack.pop();
            if (map.get(top) == c){
                continue;
            }
            return false;
        }
        if (stack.empty()){
            return true;
        }
        return false;
    }
}


原文作者:zyt0528
原文链接:https://blog.csdn.net/zyt0528/article/details/108361209

全部评论

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言&nbsp;前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法&nbsp;就是复现一个landing手册上的go框架小项目&nbsp;就是相当于帮自己锻炼锻炼怎么写go&nbsp;或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe&nbsp;coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag&nbsp;prompt&nbsp;langchain&nbsp;mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一&nbsp;我觉得字节饭挺好吃的!
双非后端失败第N人:1. go语言我建议你让ai带着你先把基本语法速通了,然后再去用go重新刷你以前刷过的leetcode,这样熟悉起来很快 2. 直接看你们组go项目,里面用***比较复杂,然后把每一个语法现象都喂给ai,一点点看
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务