32. Longest Valid Parentheses

1、题目描述

给出一个只含有(和)的字符串,返回最长的括号匹配合法的子串。


2、思路

动态规划。

dp[i] 指的是以位置i结尾的最长合法子串的长度。

初始化:dp[i]=0

状态转移:只有s[i]==),dp[i]才有可能大于0.

1)s[i-1]==(,dp[i] = dp[i-2]+2;

2)s[i-1]==),s[i-dp[i-1]-1]==(

dp[i] = dp[i-1]+2;

if i-dp[i-1]-2 >=0

        dp[i] += dp[i-dp[i-1]-2];


返回最长的dp[i]。

复杂度O(n)


3、代码

    int longestValidParentheses(string s) {
        int l = s.size();
        if(l==0) return 0;
        int ans = 0;
        int dp[l] = {0};
        for(int i=1;i=0)
                            dp[i]+=dp[i-dp[i-1]-2];
                    }
                }
                if(dp[i]>ans)
                    ans=dp[i];
            }
            
        }
        return ans;
    }


你可能感兴趣的:(刷题笔记)