算法刷题之六栈

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。算法刷题之六栈,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

算法刷题之六栈

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.bmabk.com/index.php/post/196575.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!