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;
    }

  • Melad Ezzat

    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 resultado = 0;

    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()){

    resultado=0;

    }else{

    stack.pop();

    resultado+=2;

    if(stack.empty()){

    best = Math.max(resultado, best);

    }

    }

    }

    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.