LeetCode 20 有效的括号

该博客介绍了一种使用堆栈解决有效括号字符串判断的方法。通过遍历字符串,遇到左括号压栈,遇到右括号时检查栈顶元素是否与其匹配,不匹配或栈为空则返回false。遍历结束后,栈为空则返回true,否则false。提供的Python和Java代码实现了这个逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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

有效字符串需满足:

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


举例:

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

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

思路:使用堆栈

1.遍历字符串,遇到左括号压入堆栈

2.遇到右括号--堆栈是否为空-- 堆栈空,false

                                                  -- 堆栈非空,栈顶和当前右括号是否为一对-- 是,栈顶弹出

                                                                                                                             -- 否,false

3遍历结束,堆栈空---True,反之---False

python:

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = []
        pairs = {")":"(", "]":"[", "}":"{"}
        if len(s) % 2 == 1:
            return False
        for i in (s):
            if i in ("(","[","{"):
                stack.append(i)
            else:
                if len(stack) == 0:
                    return False
                elif stack[-1] == pairs[i]:
                    stack.pop()
                else:
                    return False
        if len(stack) == 0:
            return True
        else:
            return False

java:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;


public class SolutionTwenty {
    public static void main(String[] args) {
        SolutionTwenty solutionTwenty = new SolutionTwenty();
        boolean bool = solutionTwenty.isValid("[]{}})");
        System.out.println(bool);
    }
    public boolean isValid(String s) {
        // 创建一个空栈
        Stack<Character>stack = new Stack<Character>();
        // 创建一个Map集合接收括号对内容
        Map<Character, Character> pairs = new HashMap<>();
        pairs.put(')','(');
        pairs.put(']','[');
        pairs.put('}','{');
        // 创建一个集合存放左括号
        Collection<Character> pairsLeft = pairs.values();
        // 括号为单数不能构成有效的括号
        int len = s.length();
        if(len % 2 == 1){
            return false;
        }
        
        for (char i : s.toCharArray()){
            // 遍历传入的参数,如果是左括号压入栈内
            if(pairsLeft.contains(i)){
            stack.push(i);
            }else{
                // 如果是右括号,若此时栈为空则为无效括号,如果与栈顶为一对括号则推出栈顶,如果不是一对则也为无效括号
                if (stack.isEmpty()){
                    return false;
                } else if (pairs.get(i) == stack.peek()){
                    stack.pop();
                } else{
                    return false;
                }
            }
        }
        // 所有右括号配对后检查此时栈是否为空
        if(stack.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值