给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())
" 输出: 4 解释: 最长有效括号子串为"()()"
思路:动态规划的思想,dp[i]为以s[i]为结尾的最长字符串的大小
1.当s[i]='('时,dp[i]=0
2.当s[i]=')'时,考虑s[i-1]是否是含有大于0的字符串,此时,考虑j=i-1-dp[i-1]个位置的字符串是否为'(',因为我们是从0开始计数的,所以要考虑j是否大于0,不然会出错。
- 当s[j]='(',如果j>0,那么dp[i]=2+dp[i-1]+dp[j-1]
- 当s[j]='(',如果j<=0,那么dp[i]=2+dp[i-1]
- 当s[j]=')',不管j是大于0还是小于0,dp[i]=2+dp[i-1]
def longestValidParentheses(self, s):
n=len(s)
dp=[0]*n
for i in range(1,n):
if s[i]=='(':
continue
j=i-1-dp[i-1]
if s[j]=='(':
if j>0:
dp[i]=2+dp[i-1]+dp[j-1]
else:
dp[i]=2+dp[i-1]
print(max(dp))