栈,你告诉我这个括号配不配!

简介: 栈,你告诉我这个括号配不配!

大家好呀,我是帅蛋。


今天来判断括号是否有效,常见题


不知道说啥,开整吧。

640.png

   LeetCode 20:有效的括号



题意


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


示例


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

输出:true


输入:s = "([)]"

输出:false


提示


有效字符串需满足:


  • 左括号必须用相同类型右括号闭合
  • 左括号必须以正确顺序闭合


1 <= s.length <= 10^4

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


题目解析


括号匹配是使用栈解决的经典问题,难度简单。


还不太会的臭宝看下面链接,本蛋写的:


呔!“栈”住,队列!


看会了栈,这道题基本就会了大半,剩下小半就是动动小脑袋瓜,稍微思考。


这题就是维护一个栈,碰到左括号就入栈,碰到右括号,取出栈顶元素,判断栈顶元素和右括号是否匹配。


如果不匹配,返回 false,如果匹配则重复上述步骤,直到遍历完字符串。


需要注意的是,有两种特殊情况也是返回 false:


  • 遍历完整个字符串,栈不为空,说明多了左括号。
  • 碰到右括号,但此时栈为空,说明多了右括号。


抛除上面的情况,其余的都返回 true。

图解


假设 s = "()[]{}"


首先初始化。

# 初始化
stack = []
pairs = {
    ')': '(',
    ']': '[',
    '}': '{'
}

根据“题目解析”中说的,碰到左括号入栈,所以第 1 步,"(" 入栈

640.png

for i in s:
    # 如果是左括号,压入栈
    if i not in pairs:
        stack.append(i)

接下来碰到右括号 ")",取出栈顶元素 "(",判断栈顶元素是否和当前右括号配对,结果发现配对。


640.png

既然匹配,那就继续进行下 1 步,接下来碰到左括号 "[",入栈。

640.png

接下来碰到右括号 "]",取出栈顶元素 "[",判断栈顶元素是否和当前右括号配对,结果发现配对

640.png

既然又匹配,那就继续进行下 1 步,接下来碰到左括号 "{",入栈。

640.png

接下来碰到右括号 "}",取出栈顶元素 "{",判断栈顶元素是否和当前右括号配对,结果发现配对。

640.png

此时字符串全部遍历完,同时栈也为空,字符串 s 有效,返回 true。


return not stack

再来假设 s = "([)]"


前两个元素都是左括号,所以直接入栈。

640.png


啥接下来碰到右括号 ")",取出栈顶元素 "[",栈顶元素与右括号不匹配,返回 false。

640.png

# 在遍历过程中,碰到空栈或者括号不匹配,返回 False。
elif not stack or pairs[i] != stack.pop():
    return False

每个元素的进栈或出栈的操作都是 O(1),最坏情况下,每个元素都会进且仅进栈 1 次,所以时间复杂度为 O(1) * n = O(n)


同理,最坏情况下,是所有的元素都入栈,所以空间复杂度也为 O(n)


代码实现


Python 代码实现

class Solution:
    def isValid(self, s: str) -> bool:
        # 字符串有奇数个元素,不匹配
        if len(s) % 2 == 1:
            return False
        # 初始化栈
        stack = []
        pairs = {
            ')': '(',
            ']': '[',
            '}': '{'
        }
        for i in s:
            # 如果是左括号,压入栈
            if i not in pairs:
                stack.append(i)
            # 在遍历过程中,碰到空栈或者括号不匹配,返回 False。
            elif not stack or pairs[i] != stack.pop():
                return False
        # 全部遍历完,如果栈为空,返回 True,栈不为空,返回 False
        return not stack

Java 代码实现

class Solution {
    public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            //碰到左括号,就把相应的右括号入栈
            if (ch == '(') {
                deque.push(')');
            }else if (ch == '{') {
                deque.push('}');
            }else if (ch == '[') {
                deque.push(']');
            } else if (deque.isEmpty() || deque.peek() != ch) {
                return false;
            }else {//如果是右括号判断是否和栈顶元素匹配
                deque.pop();
            }
        }
        //最后判断栈中元素是否匹配
        return deque.isEmpty();
    }
}


图解有效的括号到这里就结束啦。


栈的实战第一道题,题目比较简单,写写画画仔细思考一定没问题哒。


有问题,扔到留言区。


看到这都是真爱,记得点赞在看么么哒呀。


我是帅蛋,我们下次见!



640.gif







相关文章
|
20天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
102 9
|
11天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
19 1
|
13天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
16天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
18天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
46 4
|
23天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
20 1
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
71 1
|
1月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
17 0
|
1月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式

热门文章

最新文章