本题用动态规划求解,通过积累计算过的有效括号的数量来找以当前字符结尾有效括号的数量。
状态转移方程:
动态规划是以时间换空间的做法,对于计算过的结果保存下来,不再计算;
在本次中dp数组设置为以当前字符结尾的有效括号的数量;
这一题与最长递增子序列那一题dp数组表示的含义大致相同(异曲同工之妙);
分析:
如果当前字符s[i]为’(’,则很明显以该字符结尾的有效括号的数量为0;
如果当前字符s[i]为’)’,
则如果s[i - 1]为’(’,那么dp[i] = dp[i - 2] + 2;
则如果s[i - 1]为’)’,则前一个字符的有效括号数量为dp[i - 1],i - dp[i - 1] - 1表示当前有效括号数量之前的一个字符,如果s[i - dp[i - 1] - 1] = ‘(’,则dp[i] 的有效括号有以下两部分组成:
1.dp[i - 1] + 2
2.dp[i - dp[i - 1] - 2]. (表示dp[i - 1] + 2之前的有效括号的数量)。
代码如下:
class Solution:
def longestValidParentheses(self, s):
if len(s) == 0:
return 0
dp = [0] * len(s)
for i in range(len(s)):
if s[i] == ')' and i > 0:
if s[i - 1] == '(':
dp[i] = dp[i - 2] + 2
else:
if i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(':
dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]
return max(dp)