算法刷题之六栈

1.有效括号
2.最长有效括号

有效的括号

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

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true

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

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

方法:判断括号是否有效,遇到左边括号时压栈,遇到右边括号时出栈,比较两个是否能匹配。这个栈这个数据结构用的很巧妙。

class Solution:
    def isValid(self, s: str) -> bool:

        if len(s) % 2 == 1:
            return False
        
        parais = {
            ")":"(",
            "]":"[",
            "}":"{"
        }
        stack = []
        for i in s:
            if i in parais:
                if not stack or stack[-1] != parais[i]:
                    return False
                else:
                    stack.pop()
            else:
                stack.append(i)
        return not stack

最长有效括号

题目:
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
 
示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:

输入:s = ""
输出:0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses

方法:判断括号的匹配,遇到左括号入栈,遇到右括号出栈,最后找到栈中剩下的元素的下标,两者之差就是最长有效。

class Solution:
    def longestValidParentheses(self, s: str) -> int:

        n = len(s)
        stack = [-1]
        length = 0

        for i in range(n):
            if s[i] == '(':
                stack.append(i) 
            else:
                stack.pop()
                if not stack:
                    stack.append(i)
                else:
                    length = max(length, i-stack[-1])

        return length

栈小结

关于栈这中数据结构,直接用这个结构特性的题目不多,配合其他数据结构的比较多。比如在DFS中就使用了循环和栈的配合,BFS中使用了队列和栈的配合。
遇到括号匹配等关键字,考虑栈这种数据结构。

原文地址:https://www.cnblogs.com/goldsunshine/p/14930643.html