https://leetcode.com/problems/longest-valid-parentheses/
栈的应用,以及思路转化
个人解答
class Solution:def longestValidParentheses(self, s: str) -> int:res = 0stk = [-1]for i, x in enumerate(s):if x == '(':stk.append(i)else:stk.pop()if not stk:stk.append(i)else:res = max(res, i - stk[-1])return res
题目分析
括号匹配问题,属于比较明显的栈的应用问题。
找到长的一段匹配的括号比较直接,关键是处理并列的情况。
最开始的思路,记录下以每个位置结尾的最长valid段,然后每次有新的段之后,加上前边的段:
class Solution:def longestValidParentheses(self, s: str) -> int:res = 0curr = 0stk = []segments = defaultdict(int)for i, x in enumerate(s):if x == '(':stk.append(i)else:if not stk:continuesegments[i] = i - stk[-1] + 1 + segments[stk[-1] - 1]stk.pop()return max(segments.values()) if segments else 0
但其实这道题可以转变下思路:找最长的valid段,其实两个invalid中间的都是valid的,所以只要记录上一个不是valid的index就好了。最开始的invalid index是-1,之后遇到)多出的invalid情况,更新invalid index。
最终解法如题解中的代码所示。
