leetcode 20 有效的括号 (c++和python)

本文详细解析了括号匹配问题的解决方法,通过使用栈数据结构实现字符串中括号的有效性判断,提供了C++和Python两种语言的实现代码。

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

题目描述:

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

有效字符串需满足:

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

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

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:

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

解题思路:

 使用栈。

1)遍历字符串,左括号入栈;

2)如果遇到是右括号,则出栈,并判断出栈的字符和该右括号是否是同类型括号,是则下一个字符,否,则返回false;

3)最后判断栈是否为空,空则返回true,反之,返回false。

C++代码:

class Solution {
public:
    bool isValid(string s) {
        /***
        先进后出,用栈
        遍历字符串,遇到左符号,入栈,遇到右符号出栈,并判断是否相等。

        ***/

        // 先备份符号配对关系
        map<char, char> left_right_map;
        left_right_map['('] = ')';
        left_right_map['{'] = '}';
        left_right_map['['] = ']';

        // 特殊情况
        if (s.size() <= 1) return false;
        vector<char> stack;
        for (int i = 0; i < s.size(); i++)
        {   
            // 判断左右符号
            if (left_right_map.find(s[i]) != left_right_map.end())  stack.push_back(s[i]);  // 找到了,即是左
            else  // 则是右符号
            {   
                // 出栈,判断出栈的左符号,和当前的右符号是否匹配
                if (stack.empty()) return false;  
                else{
                    char cur_left = stack[stack.size() - 1];
                    stack.pop_back();  // 出栈顶元素,即左符号
                    if (left_right_map[cur_left] == s[i])  continue;// 左右符号是否相等
                    else return false;
                }
                
                
            }
            
        }
        if (stack.size() != 0) return false;
        return true;
    }
};

python代码:

执行用时:20 ms, 在所有 Python 提交中击败了56.10%的用户

内存消耗:13.2 MB, 在所有 Python 提交中击败了31.95%的用户

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        # 备份左右符号匹配关系
        left_right_dict = {
            "(": ")",
            "{": "}",
            "[": "]"
        }

        # 处理特殊情况
        if len(s) <= 1: return False

        # 遍历字符串
        left_stack = []
        for i in range(len(s)):
            # 判断左右字符
            if s[i] in left_right_dict.keys():  
                left_stack.append(s[i])    # 左符号入栈
            else:
                # 右符号出栈,并判断出栈的左符号和当前右符号是否匹配.
                if len(left_stack) == 0: return False
                if left_right_dict[left_stack[-1]] == s[i]: 
                    del left_stack[-1]  # 出栈了
                    continue
                else: return False

        # 如果存放左符号的栈不空,则说明多了左符号
        if len(left_stack) == 0:
            return True
        else:
            return False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值