【面试经典150 | 栈】有效的括号

文章目录

Tag

【栈】


题目来源

20. 有效的括号


题目解读

括号有三种类型,分别是小括号、中括号和大括号,每种括号的左右两半括号必须一一对应才是有效的括号,如果某一种括号之间穿插者其他的闭合的括号,那么这个括号字符串也是有效的,比如 "({[]})" 就是一个有效的括号字符串。

现在给你一个仅有括号组成的字符串,判断该字符串是否是有效的字符串。


解题思路

方法一:栈+哈希表

本题使用栈来解决,我们可以边更新栈边在栈中找闭合的括号。

我们遍历字符串,如果栈为空,我们自然是要将当前的括号字符加入到栈中的,继续遍历字符串:

  • 当遇到的括号是右括号时,我们希望可以找到一个相同类型的左括号,于是如果栈顶的括号是对应类型的左括号,那么我们就将栈顶匹配的左括号弹出站;如果栈顶的括号不是对应类型的左括号,则当前遍历的括号无法闭合,那么该符号字符串不是有效的字符串,直接返回 false
  • 当遇到的括号是左括号字符串时,直接将当前字符入栈;
  • 遍历完字符串,如果最后栈为空,则该字符串是有效的字符串,直接返回 true;否则返回 false

在判断当前遍历的字符是否是右括号时,可以使用哈希表。具体地,定义一个键为右括号字符,值为对应的左括号字符的哈希表 pairs。在遍历字符串时,如果当前字符在哈希表的键中,可以使用 pairs.count() 或者 pairs.find() 来查找当前字符是否是右括号;如果当前字符是右括号,那么还可以使用哈希表来查找栈顶元素是否是左括号。

特别的,如果字符串的长度为奇数,那么该字符串一定不是有效的括号字符串。

实现代码

cpp 复制代码
class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
		if (n % 2 == 1)
			return false;

		unordered_map<char, char> pairs = {
			{')', '('},
			{']', '['},
			{'}', '{'}
		};

		stack<char> st;
		for (auto ch : s) {
			if (pairs.count(ch)) {
				if (st.empty() || st.top() != pairs[ch])
					return false;
				st.pop();
			}
			else st.push(ch);
		}
		return st.empty();
    }
};

复杂度分析

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

空间复杂度: O ( n ) O(n) O(n)。


其他语言

c

c 复制代码
char pairs(char a) {
    if (a == '}') return '{';
    if (a == ']') return '[';
    if (a == ')') return '(';
    return 0;
}

bool isValid(char* s) {
    int n = strlen(s);
    if (n % 2 == 1) {
        return false;
    }
    int stk[n + 1], top = 0;
    for (int i = 0; i < n; i++) {
        char ch = pairs(s[i]);
        if (ch) {
            if (top == 0 || stk[top - 1] != ch) {
                return false;
            }
            top--;
        } else {
            stk[top++] = s[i];
        }
    }
    return top == 0;
}

python3

py3 复制代码
class Solution:
    def isValid(self, s: str) -> bool:
        if len(s) % 2 == 1:
            return False
        
        pairs = {
            ")": "(",
            "]": "[",
            "}": "{",
        }
        stack = list()
        for ch in s:
            if ch in pairs:
                if not stack or stack[-1] != pairs[ch]:
                    return False
                stack.pop()
            else:
                stack.append(ch)
        
        return not stack

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

相关推荐
IT猿手25 分钟前
2025高维多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码
开发语言·人工智能·算法·机器学习·matlab·无人机·cocos2d
阿乾之铭40 分钟前
动态规划算法
算法·动态规划
菠菠萝宝42 分钟前
【代码随想录】第九章-动态规划(上)
算法·动态规划·01背包·完全背包·多重背包·上楼梯
DTDanteDong43 分钟前
从头再来!社招找工作——算法题复习九:动态规划
算法·动态规划
Coco_92641 小时前
Hot100 动态规划
算法·动态规划
卑微的小鬼1 小时前
golang的var ,make ,new, := 的区别
算法
01_2 小时前
力扣hot100 ——和为k的子数组 前后缀和(积)各种情况总结
数据结构·算法·leetcode·前后缀和(积)计算
一只码代码的章鱼2 小时前
数据结构与算法-搜索-双向搜索 和 A*算法(字串变换,八数码,第k短路)
算法
咚咚轩2 小时前
算法1-2 排序(快排)
算法
楼台的春风2 小时前
【STM32 基于PID的闭环电机控制系统】
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·算法