LeetCode 面试经典 150_栈_有效的括号(52_20_C++_简单)(栈+哈希表)

LeetCode 面试经典 150_栈_有效的括号(52_20_C++_简单)

题目描述:

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

有效字符串需满足:

1、左括号必须用相同类型的右括号闭合。

2、左括号必须以正确的顺序闭合。

3、每个右括号都有一个对应的相同类型的左括号。

输入输出样例:

示例 1:
输入 :s = "()"
输出:true

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

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

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

提示:

1 <= s.length <= 104

s 仅由括号 '()\[\]{}' 组成

题解:

解题思路:

思路一(栈+哈希表):

1、将左右括号的对应关系存储在哈希表中,key存储右括号,value存储左括号(因左括号只有入栈的操作,而右括号需判断栈顶有没有与之对应的左括号)。

① 先检查数组中元素的个数,如果为偶数,则有可能是有效的括号。如果为奇数,则不可能为有效的括号返回false。

② 当是左括号时,左括号入栈。

③ 当是右括号时,栈顶存在与之对应的左括号,则左括号出栈。若不存在与之对应的左括号则返回false。

④ 若最后栈为空则返回true,否则返回false。

2、复杂度分析

① 时间复杂度:O(n),n 是字符串 s 的长度。

② 空间复杂度:O(n+∣Σ∣),n 是字符串 s 的长度,Σ 表示字符集,本题中字符串只包含 6 种括号,∣Σ∣=6。栈中字符数最多为 n(例如全是左括号),栈中的字符数量为 O(n)。当 n 足够大时∣Σ∣可忽略。

代码实现

代码实现(思路一(栈+哈希表)):
cpp 复制代码
class Solution {
public:
    bool isValid(string s) {
        //如果左右括号总数是奇数,直接返回false
        if (s.size()%2==1) return false;
        
        //创建左右括号的对应关系,注意key=右括号,value=左括号(因左括号直接入栈无其他情况)
        unordered_map<char,char> mp={{')','('},{']','['},{'}','{'}};
        
        stack<char> stk;
        //对字符串中的每个字符进行判断
        for (const auto &ch :s){
            //如果是右括号
            if (mp.count(ch)){
                //当右括号且栈空或者左右括号不匹配返回false匹配失败
                if (stk.empty() || stk.top()!=mp[ch]){
                    return false;
                }
                //当左右括号对应则出栈
                else{
                    stk.pop();
                }
            //左括号直接入栈
            }else{
                stk.push(ch);
            }
        }
        //如果最后栈为空则返回true,否则返回false(其中只有左括号)
        return stk.empty();
            
    }
};
以思路一为例进行调试
cpp 复制代码
#include<iostream>
#include<stack>
#include<unordered_map>
using namespace std;

class Solution {
public:
    bool isValid(string s) {
        //如果左右括号总数是奇数,直接返回false
        if (s.size()%2==1) return false;
        
        //创建左右括号的对应关系,注意key=右括号,value=左括号(因左括号直接入栈无其他情况)
        unordered_map<char,char> mp={{')','('},{']','['},{'}','{'}};
        
        stack<char> stk;
        //对字符串中的每个字符进行判断
        for (const auto &ch :s){
            //如果是右括号
            if (mp.count(ch)){
                //当右括号且栈空或者左右括号不匹配返回false匹配失败
                if (stk.empty() || stk.top()!=mp[ch]){
                    return false;
                }
                //当左右括号对应则出栈
                else{
                    stk.pop();
                }
            //左括号直接入栈
            }else{
                stk.push(ch);
            }
        }
        //如果最后栈为空则返回true,否则返回false(其中只有左括号)
        return stk.empty();
            
    }
};

int main(int argc, char const *argv[])
{
    string s="((()))";
    //判断有效的括号
    Solution s1;
    if (s1.isValid(s))
    {
        cout<<"true"<<endl;
    }else{
        cout<<"false"<<endl;
    }
    return 0;
}

LeetCode 面试经典 150_栈_有效的括号(52_20)原题链接

欢迎大家和我沟通交流(✿◠‿◠)

相关推荐
同勉共进13 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋13 小时前
C ++ [ hello world ]
c语言·c++·算法
kyriewen15 小时前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程
王维同学17 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
Scott9999HH18 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
脱胎换骨-军哥18 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
旖-旎20 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
胖大和尚21 小时前
C++ 多线程编程的实现方式
c++·thread
在水一缸1 天前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
良木林1 天前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口