给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
方法一:动态规划
Algorithm:
动态规划的题目一般分成三步:
1、确定状态,也就是你的答案表是存什么答案的。
2、确定状态转移方程,也就是怎么将你的答案表填满,换句话说,就是一些表达式。
3、确定边界情况,什么情况下有可能越界,要单独判断考虑(有可能无边界情况)。
int longestValidParentheses(string s) {
int maxLen = 0;
vector<int> dp(s.length());
for (int i = 1; i < s.length(); i++) {
if (s[i] == ')') {
if (s[i - 1] == '(') {
dp[i] = (i - 2 >= 0 ? dp[i - 2] : 0) + 2;
} else if (i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(') {
dp[i] = (i - dp[i - 1] - 2 >= 0 ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2; //考虑了边界条件
}
}
maxLen = fmax(dp[i], maxLen);
}
return maxLen;
}
复杂度分析:
- 时间复杂度:O(n)。遍历整个字符串一次,就可以将
dp
数组求出来. - 空间复杂度: O(n)。需要一个大小为
n
的dp
数组.