Description
https://leetcode.com/problems/longest-valid-parentheses/
Solving Ideas
https://leetcode.com/problems/longest-valid-parentheses/solution/
动态规划:
State:
dp[i]
: 以第 i 个元素为结尾的最长有效子串的长度
Initial State:
dp[i] = 0
State Transition:
-
if s[i] = ‘)’ and s[i - 1] = ‘(’, i.e. string looks like “…()”:
dp[i] = dp[i - 2] + 2 (i >= 2)
-
if s[i] = ‘)’ and s[i - 1]=’)’, i.e. string looks like “…))”:
if s[i - dp[i - 1] - 1] = ‘(’ then
dp[i] = dp[i-1] + 2 + dp[i - dp[i - 1] - 2] (i - dp[i-1] >= 2)
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
Solution
class Solution {
public int longestValidParentheses(String s) {
if (s == null || s.length() < 1) return 0;
int maxans = 0;
//dp[i] represent the length of the longest valid substring
//ending at ith index.
int[] dp = new int[s.length()];
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
} else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
dp[i] = dp[i - 1] + 2 + (i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0);
}
maxans = Math.max(maxans, dp[i]);
}
}
return maxans;
}
}
class Solution {
public int longestValidParentheses(String s) {
if (s == null || s.length() < 1) return 0;
int maxans = 0;
Stack<Integer> stack = new Stack<>();
stack.push(-1);
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);
} else {
stack.pop();
if (stack.empty()) stack.push(i);
else maxans = Math.max(maxans, i - stack.peek());
}
}
return maxans;
}
}