https://leetcode.com/problems/longest-valid-parentheses/
栈的应用,以及思路转化
个人解答
class Solution:
def longestValidParentheses(self, s: str) -> int:
res = 0
stk = [-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 = 0
curr = 0
stk = []
segments = defaultdict(int)
for i, x in enumerate(s):
if x == '(':
stk.append(i)
else:
if not stk:
continue
segments[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。
最终解法如题解中的代码所示。