首页 > 其他分享 >20_有效的括号

20_有效的括号

时间:2024-09-20 14:02:09浏览次数:10  
标签:字符 return 匹配 括号 有效 20 false stack

20_有效的括号

【问题描述】

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
示例一:
输入:s = "()"
输出:true

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

示例三:
输入:s = "(]"
输出:false

示例四:
输入:s = "([])"
输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

【算法设计思想】

在解决本题时,我们要使用一种类似于键值对的数据结构,要确保左右括号的对应关系。在Python中我们可以直接使用内置的字典数据类型,在Java中我们可以使用HashMap类,在C++中我们可以使用STL中的unordered_map来实现,在什么都没有的C语言中我们可以直接自己定义一个pairs函数用来实现这种对应关系。然后我们依次遍历给定的字符串s,如果碰到了左括号,那么我们把它加入到栈中,如果碰到了右括号,那么我们调用这种对应关系,然后判断栈顶的元素和其是否匹配,如果匹配,那么我们继续遍历,只要有一个不匹配,那么我们直接返回false即可。最后我们看一下栈是否为空,即可得出结论。

注意:

  • Java中和C++中各种数据结构的调用

【算法描述】

Python:

class Solution:
    def isValid(self, s: str) -> bool:
        # 定义括号对应关系的字典,右括号为键,左括号为值
        brackets = {')': '(', ']': '[', '}': '{'}
        
        # 初始化一个空栈,用于存放左括号
        stack = []
        
        # 遍历字符串中的每个字符
        for char in s:
            # 如果字符是左括号,将其压入栈中
            if char in brackets.values():
                stack.append(char)
            # 如果字符是右括号,检查匹配情况
            elif char in brackets:
                # 当栈为空或栈顶元素不匹配当前右括号时,返回False
                if not stack or brackets[char] != stack[-1]:
                    return False
                # 如果栈顶元素匹配当前右括号,弹出栈顶元素
                stack.pop()
        
        # 遍历结束后,检查栈是否为空
        # 如果栈为空,说明所有括号成功匹配;否则返回False
        return not stack


C++:

class Solution {
public:
    bool isValid(const std::string& s) {
        // 定义括号对应关系的 unordered_map,右括号为键,左括号为值
        std::unordered_map<char, char> brackets = {
            {')', '('},  // 右括号 ')' 对应左括号 '('
            {']', '['},  // 右括号 ']' 对应左括号 '['
            {'}', '{'}   // 右括号 '}' 对应左括号 '{'
        };

        // 初始化一个空栈,用于存放左括号
        std::stack<char> stack;

        // 遍历字符串中的每个字符
        for (char elem : s) {
            // 如果字符是左括号,将其压入栈中
            if (elem == '(' || elem == '[' || elem == '{') {
                stack.push(elem);
            }
            // 如果字符是右括号,检查匹配情况
            else if (brackets.count(elem)) {
                // 当栈为空或栈顶元素不匹配当前右括号时,返回 false
                if (stack.empty() || stack.top() != brackets[elem]) {
                    return false;
                }
                // 如果栈顶元素匹配当前右括号,弹出栈顶元素
                stack.pop();
            }
            // 如果字符既不是左括号也不是右括号,返回 false(可以选择忽略或处理非法字符)
            else {
                return false;
            }
        }

        // 遍历结束后,检查栈是否为空
        // 如果栈为空,说明所有括号成功匹配;否则返回 false
        return stack.empty();
    }
};


Java:

class Solution {
    public boolean isValid(String s) {
        // 获取字符串的长度
        int n = s.length();
        
        // 如果长度是奇数,括号不可能成对匹配,直接返回 false
        if (n % 2 == 1) {
            return false;
        }

        // 定义一个 HashMap 来存储括号的配对关系
        // 右括号为键,左括号为值
        Map<Character, Character> pairs = new HashMap<Character, Character>() {
            {
                put(')', '(');  // 右括号 ')' 对应左括号 '('
                put('}', '{');  // 右括号 '}' 对应左括号 '{'
                put(']', '[');  // 右括号 ']' 对应左括号 '['
            }
        };
        
        // 初始化一个空栈,用于存放左括号
        Deque<Character> stack = new LinkedList<Character>();
        
        // 遍历字符串中的每个字符
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            
            // 如果字符是右括号,检查是否有匹配的左括号
            if (pairs.containsKey(ch)) {
                // 如果栈为空,或栈顶的左括号不匹配当前的右括号,返回 false
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
                    return false;
                }

                // 如果栈顶元素匹配当前右括号,弹出栈顶元素
                stack.pop();
            } 
            // 如果字符是左括号,将其压入栈中
            else {
                stack.push(ch);
            }
        }
        
        // 遍历结束后,检查栈是否为空
        // 如果栈为空,说明所有的括号都成功匹配;否则返回 false
        return stack.isEmpty();
    }
}

C:

/**
 * 根据给定的右括号字符返回对应的左括号字符。
 * @param ch 一个右括号字符。
 * @return 对应的左括号字符,如果不存在则返回0。
 */
char pairs(char ch)
{
    if (ch == ')')
        return '(';
    if (ch == ']')
        return '[';
    if (ch == '}')
        return '{';
    return 0;
}

/**
 * 检查给定的字符串中的括号是否正确匹配。
 * @param s 包含括号的字符串。
 * @return 如果括号正确匹配,则返回true;否则返回false。
 */
bool isValid(char *s)
{
    int n = strlen(s);
    // 如果字符串长度为奇数,则括号无法完全匹配
    if (n % 2 == 1)
    {
        return 0;
    }
    char stack[n + 1];
    int top = 0;

    for (int i = 0; i < n; i++)
    {
        char ch = pairs(s[i]);
        if (ch)
        {
            // 如果当前字符是右括号,检查它是否与栈顶的左括号匹配
            if (top == 0 || stack[top - 1] != ch)
            {
                return 0;
            }
            top--;
        }
        else
        {
            // 如果当前字符是左括号,将其压入栈顶
            stack[top++] = s[i];
        }
    }
    // 如果栈为空,说明所有括号都正确匹配
    return top == 0;
}

标签:字符,return,匹配,括号,有效,20,false,stack
From: https://www.cnblogs.com/zeta186012/p/18422388

相关文章

  • [2025]基于微信小程序停车场预约计费系统(基于微信小程序的智能停车场预约与计费系统、
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • 【力扣刷题】2090.半径为k的子数组平均值(定长滑动窗口)
    题目:给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。半径为k的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i-k 和 i+k 范围(含 i-k 和 i+k)内所有元素的平均......
  • ACL会议2024-MPLMM精读
    论文地址:MultimodalPromptLearningwithMissingModalitiesforSentimentAnalysisandEmotionRecognition-ACLAnthology代码地址:GitHub-zrguo/MPLMM:[ACL2024Main]OfficialPyTorchimplementationofthepaper"MultimodalPromptLearningwithMissingMo......
  • 周五学习 -2024/9/20
    今天9月20日,出发去徐州!HashMapHashMap的特点HashMap底层是哈希表结构的依赖hashCode方法和equals方法保证键的唯一如果键存储的是自定义对象,需要重写hashCode和equals方法DQL-分页查询SELECT字段列表FROM表名LIMIT起始索引,查询记录数;注意:起始索引从0开始,......
  • IEEE 1838-2019协议翻译——第五章 Serial test access ports
    目录5.1Primarytestaccessport5.1.1Specifications5.1.2Description5.2Primarytestaccessportcontroller5.2.1Specifications5.2.2Description5.3Secondarytestaccessport(STAP)5.3.1Specifications5.3.2Description5.......
  • 9.20 斜率优化复习
    看我之前写的狗屎:https://www.becoder.com.cn/article/11836。当时根本就不懂斜率优化是什么。今天真的懂了,来写总结。1问题转化对于一类dp方程式:\(f(i)=\min\{f(j)+A(j)*g(i)+B(j)+t(i)\}\)。可以用斜率优化。设\(b=f(i)-t(i)\)。把当前dp转移当成是一条斜率......
  • INFS4203/7203 Project
    INFS4203/7203Projectemester2,2024Duedates:16:00on13thSeptember2024forprojectproposal(Phase1,15%)16:00on25thOctober2024forprojectreport(Phase2,20%)ImportantAssignmentSubmissionGuidelines:Allassignmentsmustbesubmittede......
  • 在ARM开发板上实现2048小游戏
     event.h屏幕点击事件.h文件:获取屏幕的xy坐标,获取手指滑动的方向,获取点击事件。#ifndef__EVENT_H_#define__EVENT_H_#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<dirent.h>#inclu......
  • C++20 模块化(Modules)
    C++20引入的模块化(Modules)是一个重大改进,旨在取代传统的头文件机制,提高编译速度、代码可维护性以及项目的可扩展性。模块化为C++提供了一种更现代化的代码组织方式,避免了头文件中常见的宏污染、重复编译和复杂的依赖管理问题。概念与背景在C++20之前,C++项目是通过头文......
  • Ubuntu20.04分区方案
    Ubuntu20.04的分区方案可以按照以下建议进行:一、常见分区方案 -EFI系统分区(逻辑分区):   -文件系统类型:无特定提及(通常为FAT32等适用于UEFI引导的格式)   -空间大小:4G(4096MB),这个容量足够用于UEFI引导,其作用和boot引导分区类似,但在UEFI引导下使用,默认grub引导......