DP题,过程如下:计算出以每一个元素结尾所能形成的最长合法括号子串,其中最大值即为所求。时间复杂度,空间复杂度都是O(n)。
记当前位置下标为 i :
1,若 i 位置为 ' ( ' ,则dp[i] = 0;
2,若 i 位置为 ' ) ' :
判断位置 i-dp[i-1]-1 是否为 ' ( ':
若不是: dp[i] = 0;
若是:dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2];当然需要控制边界。
class Solution {
public:
int dp[100000];
int longestValidParentheses(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(s.size() == 0) return 0;
dp[0] = 0;
int maxLen = 0;
for(int i = 1; i < s.size(); i ++)
{
if(s[i] == '(') dp[i] = 0;
else
{
if(i-dp[i-1] >= 1 && s[i-dp[i-1]-1] == '(')
{
dp[i] = dp[i-1] + 2;
if(i - dp[i-1] >= 2) dp[i] += dp[i-dp[i-1]-2];
}
else dp[i] = 0;
}
if(dp[i] > maxLen)
maxLen = dp[i];
}
return maxLen;
}
};