我的代码居然过了。。
class Solution: def expand(l,s): r = False for item in l: left = item[0] right = item[1] if left>=1 and s[left-1]=='(' and right+1<len(s) and s[right+1]==')': item[0] -= 1 item[1] += 1 r = True return r def merge(l): if len(l)<=1: return l for i in range(1,len(l)): if l[i][0]-l[i-1][1]==1: l[i][0] = -1 l[i-1][1] = -1 nl = [] for item in l: nl.extend(item) nl = [i for i in nl if i!=-1] l = [nl[i:i+2] for i in range(0,len(nl),2)] return l def longestValidParentheses(self, s: str) -> int: if len(s)==1: return 0 l = [] for i in range(1,len(s)): if s[i-1]=='(' and s[i]==')': l.append([i-1,i]) if len(l)==0: return 0 while True: l = Solution.merge(l) #print('merge',l) r = Solution.expand(l,s) #print('expand',l) if not r: break l = [i[1]-i[0]+1 for i in l] return max(l)
我的思路就是模拟,括号肯定是一层一层的,所以我就从最里面一层开始,慢慢往外拓展(expand),如果拓展不了,说明就这些了。然后找到最大的区间就好了。
我的思路基本跟暴力差不多,所以性能很差。
这道题的题目描述有点问题。“找出最长的包含有效括号的子串的长度”容易让人误解,这里的子串实际上指的是连续子串。
看官方题解,给了三种方法。分别是dp,栈和贪心。这三种我都没怎么看懂。。
把链接放下面,什么时候想起来了再去研究研究 https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/
不过第一个dp我觉得解释的似乎有点问题。dp[i]定义的是到i结尾的字符串的最长有效括号的长度。
但是我用题解的代码,跑测试样例"())()",得到的dp数组为0,2,0,0,2
一共五个括号,中间那个括号,按照dp数组的定义,不应该是2嘛。这里我没相同,是题解有问题还是我没理解对?