# LeetCode – Longest Valid Parentheses (Java)

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.
Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

Analysis

This problem is similar with Valid Parentheses, which can be solved by using a stack.

Java Solution

```public static int longestValidParentheses(String s) { Stack<int[]> stack = new Stack<int[]>(); int result = 0;   for(int i=0; i<=s.length()-1; i++){ char c = s.charAt(i); if(c=='('){ int[] a = {i,0}; stack.push(a); }else{ if(stack.empty()||stack.peek()[1]==1){ int[] a = {i,1}; stack.push(a); }else{ stack.pop(); int currentLen=0; if(stack.empty()){ currentLen = i+1; }else{ currentLen = i-stack.peek()[0]; } result = Math.max(result, currentLen); } } }   return result; }```
Category >> Algorithms >> Interview
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
```<pre><code>
String foo = "bar";
</code></pre>
```
• Swat

``` public static int longestValidParentheses(String s) { int validLength = 0; int openParenthesisCount = 0; int maxValidLength = 0;```

``` ```

``` for (int i = 0; i 0) { openParenthesisCount--; validLength = validLength + 2; } else { validLength = 0; openParenthesisCount = 0; } } if(maxValidLength < validLength) { maxValidLength = validLength; } } return maxValidLength; } ```

this solution return the last valid string length
for ex: “))(((()))))()” will return 2

• Jangku

simpler version

public static int longestValidParentheses(String s) {
if (s.length() == 0 || s.length() == 1) return 0;
Stack stack = new Stack();
int result = 0;
int length = 0;
for (int i = 0; i <= s.length() – 1; i++) {
char c = s.charAt(i);
if (stack.isEmpty() && c == ')') {
length = 0;
continue;
}
if (c == '(') {
stack.push(c);
} else {
stack.pop();
length += 2;
result = Math.max(length, result);
}
}

return result;
}

• Matias SM

Here is one implementation with no extra space required (space complexity is O(1)). Time complexity is the same (O(N)): http://ideone.com/v2ST3z

• Geek Coder

Does it work for (())(() . The answer should be 4. But i guess its giving 6

• Ankit Shah

In case if you also want to print the output string as well with length, this is exactly how its described in the validatePattern method.

``` import java.util.*; public class LongestValidParenthesis { private static Map map = new HashMap(); static { map.put('(', ')'); } private static String printLongest(String input) { Stack stack = new Stack(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); // cannot start with ) string. if (stack.empty() && map.containsValue(ch)) { continue; } if (map.containsKey(ch)) { stack.push(ch); } else if (map.containsValue(ch)) { if (!stack.empty() && map.get(stack.peek()) == ch) { sb = sb.insert(0, stack.pop()); sb = sb.append(ch); } else { continue; } } } return sb.toString(); } public static void main(String[] args) { String input = "(()"; String result = printLongest(input); System.out.println("output string: " + result); System.out.println("length: " + result.length()); } } ```

• Omar Edgardo Lugo Sánchez

public class Solution {

public int longestValidParentheses(String s) {

int best = 0;

Stack stack = new Stack();

for(int i=0;i<s.length();i++){

char c = s.charAt(i);

if(c=='('){

stack.push(c);

}else if(stack.empty()){

}else{

stack.pop();

if(stack.empty()){

}

}

}

return best;

}

}

• typing..

Good Job.. Special thing is that trick of using i(index) and 0|1 for extra ‘)’, to cover this kind of testcases: ())()() :Sol is 4.