【LeetCode】32. Longest Valid Parentheses
Difficulty: Hard
More:【目录】LeetCode Java实现
Description
https://leetcode.com/problems/longest-valid-parentheses/
Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())" Output: 4 Explanation: The longest valid parentheses substring is"()()"
Intuition
Method 1: Dynamic Programming
1. Define subLen[i] as the length of the longest valid parentheses subString which is end with char at index i (s[i]).
2. If s[i]=='(', subLen[i]=0
If s[i]==')'
If(s[i-subLen[i]-1]==')', subLen[i]=0
If(s[i-subLen[i]-1]=='(', subLen[i]=subLen[i-1]+2+subLen[i-subLen[i-1]-2]
Method 2: Using a stack to store the index of '(', and using 2 pointers to store left index and right index of a subString.
Solution
Method 1
public int longestValidParentheses(String s) {
if(s==null || s.length()<=0)
return 0;
int[] subLen = new int[s.length()];
int maxLen=0;
for(int i=1; i<s.length(); i++){
if(s.charAt(i)==')'){
int pre = i-subLen[i-1]-1;
if(pre>=0 && s.charAt(pre)=='('){
subLen[i]=subLen[i-1]+2+(pre>0 ? subLen[pre-1] : 0);
}
maxLen=Math.max(maxLen,subLen[i]);
}
}
return maxLen;
}
Method 2
public int longestValidParentheses(String s) {
if(s==null || s.length()<=0)
return 0;
int maxLen=0;
int left=-1;
Stack<Integer> stk = new Stack<Integer>();
for(int i=0; i<s.length(); i++){
if(s.charAt(i)=='(')
stk.push(i);
else{
if(stk.isEmpty())
left=i;
else{
stk.pop();
int len = stk.isEmpty() ? i-left : i-stk.peek();
maxLen=Math.max(len,maxLen);
}
}
}
return maxLen;
}
Complexity
Time complexity : O(n)
Space complexity : O(n)
More:【目录】LeetCode Java实现

浙公网安备 33010602011771号