栈
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
中使用了队列和栈的配合。
遇到括号
,匹配
等关键字,考虑栈这种数据结构。