题目描述
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例
输入: “(()” 输出: 2 解释: 最长有效括号子串为 “()”
输入: “)()())” 输出: 4 解释: 最长有效括号子串为 “()()”
思路
代码
class Solution {
public:
int longestValidParentheses(string s
) {
int n
= s
.length();
vector
<int> dp(n
,0);
int max
= 0;
for(int i
= 1;i
< n
;i
++) {
if(s
[i
] == ')') {
if(s
[i
- 1] == '(') {
if(i
- 2 >= 0) {
dp
[i
] = 2 + dp
[i
-2];
} else {
dp
[i
] = 2;
}
} else if(i
-dp
[i
-1] > 0 && s
[i
-dp
[i
-1]-1] == '('){
if(i
- dp
[i
- 1] - 2 >= 0) {
dp
[i
] = 2 + dp
[i
-1] + dp
[i
-dp
[i
-1]-2];
} else {
dp
[i
] = 2 + dp
[i
-1];
}
}
}
if(dp
[i
] > max
) {
max
= dp
[i
];
}
}
return max
;
}
};
总结
本题还可以使用 栈 来完成。这是我写的第一个hard题,真是有够难的。动态规划类的题目,首先考虑好状态转换方程,其次再考虑边界条件。