leetcode:20.有效的括号

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

题目描述:


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


有效字符串需满足:


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


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


示例1:


输入: "()"
输出: true


示例2:


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


示例3:


输入: "(]"
输出: false


示例4:


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


示例5:


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


题目难度:简单


分析:


看见这题应该第一时间想到的就是利用栈来解决,也是比较简单的办法,思路:从左到右遍历字符串,如果是左括号([{其中一个,那么进行压栈的操作,如果是右括号)]}其中一个,则进行弹栈的操作,并判断弹出来的左括号是否和右括号同一类型,即是否成对匹配。如果不匹配直接返回false,匹配则继续。


代码如下:


class Solution {
    private static Map<Character, Character> map;
    // 初始化一个map用来存放括号,右括号当key,左括号当value,这样遇到右括号需要弹栈的时候比较方便
    public Solution() {
        map = new HashMap<>();
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
    }
    public boolean isValid(String s) {
    // 定义一个栈
        Stack<Character> stack = new Stack<>();
        int length = s.length();
        // 如果给定的s是空的直接返回true(测试用例)
        if (s.isEmpty()) {
            return true;
            // 很容易想到,如果字符串的长度是单数的话,那么肯定不匹配
        } else if (length % 2 == 1) {
            return false;
        } else {
          // 遍历字符串进行压栈和弹栈的操作
            for (int i = 0; i < length; i++) {
                char c = s.charAt(i);
                // 如果是右括号则需要判断栈里是否有相对应的左括号
                if (map.containsKey(c)) {
                  // 这里的“#”号只是用来作为null的替代,如果栈为空,那么“#”号肯定不匹配任何左括号
                    char tempChar = stack.empty() ? '#' : stack.pop();
                    // 如果栈不为null的话,则进行弹栈操作,然后判断是否是一对括号
                    if (tempChar != map.get(c)) {
                        return false;
                    }
                } else {
                  // 如果是左括号就压栈
                    stack.push(c);
                }
            }
        }
        // 最后如果栈为空的话,则说明是有效的括号,符合题意
        return stack.isEmpty();
    }
}


总结:


时间复杂度为O ( n ) ,只需要一次遍历即可解决问题,缺点是需要进行栈的相关操作,会比数组慢些,优点是比较简单易懂。


这里不懂栈的相关知识的小伙伴可以找找资料,需要理解什么是压栈和弹栈。

目录
相关文章
|
3月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
4天前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
4天前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
14天前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
9 0
|
15天前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
11 0
|
15天前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
7 0
|
1月前
|
算法 测试技术
力扣经典150题第五十一题:有效的括号
力扣经典150题第五十一题:有效的括号
22 0
|
2月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
24 1
LeetCode | 20. 有效的括号
LeetCode | 20. 有效的括号
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成