最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
解题思路:
动态规划
括号字串分两种:
- ()()
- ((()))
初始化容器dp,从i=1开始遍历整个字符串s:
1.查找()()类型字符子串。找到s[i]=’)‘且s[i-1]=’(‘的字符子串,dp[i]=2+s[i-2],注意如果i-2超出边界了,s[i-2]=0。
2.查找((()))类型字符子串。找到s[i]=’)‘且s[i-1]!=’(‘的字符子串,往前查找,入上图s[9],查找s[6]是否为’(’,即判断s[i-dp[i]-1]是否为’(’,若为括号对,则dp[i]=2+dp[i-1],之后再判断s[6]之前是否存在字串,即判断dp[5]是否为0,若不为0,则加上dp[5]的值,即dp[i]=dp[i]+dp[i-dp[i]],证明这是连续字串。
3.输出最大的dp[i]即最长有效括号子串。
class Solution {
public:
int longestValidParentheses(string s) {
if (s.length()==0||s.length()==1) return 0;
vector <int> dp(s.length(),0);
int max=0;
if (s.length()>=2){
for (int i=1;i<s.length();i++){
if (s[i]==')' && s[i-1]=='('){
if (i>=3){
dp[i]=dp[i-2]+2;
}
else dp[i]=2;
}
if (s[i]==')' && s[i-1]!='('){
if ((i-dp[i-1]-1)>=0 && s[i-dp[i-1]-1]=='('){
dp[i]=dp[i-1]+2;
if ((i-dp[i])>=0 && dp[i-dp[i]]>0){
dp[i]=dp[i]+dp[i-dp[i]];
}
}
}
if (dp[i]>=max){
max=dp[i];
}
}
}return max;
}
};