标签:max val int 代码 字符 条件 long 回文 size
给定一个只包含 ‘(‘ 和 ‘)‘ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
解:这道题和那道最长回文串有点像,状态转移方程为
f(n)=f(n-2)+2 if(s[n]==‘)‘&&s[n-1]==‘(‘) //这种情况说明是像()()这种连续的
f(n)=f(n-f(n-1)-2)+2 if(s[n]==‘)‘&&s[n-f(n-1)-1]==‘(‘)
下面上代码
class Solution { public: int longestValidParentheses(string s) { if(s.size()<=1) return 0; vector<int> dp(s.size(),0); int max_value=0; for(int i=1;i<s.size();i++) { if(s[i]==‘)‘) { if(s[i-1]==‘(‘) { dp[i]=(i>=2?dp[i-2]:0)+2; } //第(i-1)下标符合条件的子串 的前一个与第i个匹配 //每次执行前先判断下s下标是否大于0 else if(i - dp[i - 1] > 0&&s[i-dp[i-1]-1]==‘(‘) { dp[i]=dp[i-1]+((i - dp[i - 1]) >= 2?dp[i-dp[i-1]-2]:0)+2; } } max_value=max(max_value,dp[i]); } return max_value; } };
标签:max val int 代码 字符 条件 long 回文 size
原文地址:https://www.cnblogs.com/wangshaowei/p/12337007.html