【LeetCode面试150】——20有效的括号

博客昵称:沈小农学编程

作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!

PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

题目难度:简单

默认优化目标:最小化时间复杂度。

Python默认为Python3。

目录

[1 题目描述](#1 题目描述)

[2 题目分析](#2 题目分析)

[3 算法框架及代码实现](#3 算法框架及代码实现)

[3.1 栈](#3.1 栈)

参考文献


1 题目描述

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

有效字符串需满足:

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

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

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

示例 1:

**输入:**s = "()"

**输出:**true

示例 2:

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

**输出:**true

示例 3:

**输入:**s = "(]"

**输出:**false

示例 4:

**输入:**s = "([])"

**输出:**true

提示:

  • 1 <= s.length <= 104

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

2 题目分析

输入是一个字符串数组s,输出是布尔值。判断s是否有效。有效的条件是左右括号类型相同且以正确的方式闭合。

3 算法框架及代码实现

3.1 栈

因为需要判断左右括号类型是否正确,我们可以开一个字典将类型相同的左右括号变成一对。然后从左往右进行对左括号压栈出栈操作,判断与右括号的关系,即:

· 如果是左括号,则添加到栈中;

· 如果是右括号,则检查栈是否为空栈,或栈顶的左括号是否与当前右括号相匹配。匹配诚恐后为true;反之为false。

流程图如下:

复制代码

时间复杂度,空间复杂度是字典开辟的空间。

**C++**代码实现

cpp 复制代码
class Solution {
public:
    bool isValid(string s) {
        if(s.size()%2==1){
            return false;
        }
        unordered_map<char, char> pairs={
            {')', '('},
            {']', '['},
            {'}', '{'}
        };
        stack<char> st;
        for(char ch:s){
            if(ch=='(' || ch=='[' || ch=='{') st.push(ch);
            else{
                if(st.empty() || st.top()!=pairs[ch]) return false;
                st.pop();
            }
        }
        return st.empty();
    }
};

Python代码实现

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

参考文献

力扣面试经典150题

力扣官方题解

相关推荐
程序员小崔日记3 分钟前
大三备战考研 + 找实习:我整理了 20 道必会的时间复杂度题(建议收藏)
算法·408·计算机考研
lizhongxuan1 小时前
AI小镇 - 涌现
算法·架构
用户3958561421143 小时前
从理论到实践:哪些EMBA项目真正提供“干货”课程?
面试
AI工程架构师4 小时前
通常说算力是多少 FLOPS,怎么理解,GPU和CPU为什么差异这么大
算法
Wect4 小时前
JSX & ReactElement 核心解析
前端·react.js·面试
不想写代码的星星4 小时前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
祈安_4 小时前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
明月_清风5 小时前
Python 内存手术刀:sys.getrefcount 与引用计数的生死时速
后端·python
明月_清风5 小时前
Python 消失的内存:为什么 list=[] 是新手最容易踩的“毒苹果”?
后端·python
归去_来兮17 小时前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值