class Solution {
public:
//用dp[i]表示以i结尾的最长有效括号字串长度
//当s[i] == '(' 时显然dp[i] = 0
//当s[i] == ')' 时
//1.当s[i - 1] == '('时,自然dp[i] = dp[i - 2] + 2;
//2.当s[i - 1] == ')'且s[i - 1]为结尾的最长有效子串的前一个字符x(位置为i - dp[i - 1] - 1)为'('时
//dp[i] = dp[i - 1] + 2 再加上以x - 1(即i - dp[i - 1] - 2)为结尾的最长有效子串长度。
int dp[30005] = {0};
int longestValidParentheses(string s) {
int sz = s.size();
for(int i = 1; i < sz; i++){
if(s[i] == '('){
dp[i] = 0; continue;
}
else if(s[i] == ')'){
if(s[i - 1] == '('){
if(i == 1) dp[i] = 2;
else dp[i] = dp[i - 2] + 2;
}
else if((i - dp[i - 1] - 1) >= 0 && s[i - dp[i - 1] - 1] == '('){
if((i - dp[i - 1] - 2) >= 0) dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] +2;
else dp[i] = dp[i- 1] + 2;
}
}
}
int ans = 0;
for(int i = 0; i < sz; i++) ans = max(ans, dp[i]);
return ans;
}
};
leetcode 32.最长有效括号 (动态规划)
于 2023-03-20 21:03:12 首次发布