LeetCode--32--hard--LongestValidParentheses

package com.app.main.LeetCode.dynamic;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

/**
 * 32
 *
 * hard
 *
 * 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 "()()"
 *
 *
 * Created with IDEA
 * author:Dingsheng Huang
 * Date:2019/12/31
 * Time:下午3:07
 */
public class LongestValidParentheses {

    private Map<Integer, Integer> cache = new HashMap();

    private int end;

    public int longestValidParentheses(String s) {
        // transfer equation :
        int max = 0;
        for (int i = 1; i < s.length(); i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (validate(s.substring(j, i + 1))) {
                    max = Math.max(max, i - j + 1);
                }
            }
        }
        return max;
    }

    private boolean validate(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ')') {
                if (stack.isEmpty()) {
                    return false;
                }
                Character ch = stack.pop();
                if (ch != '(') {
                    return false;
                }
            } else {
                stack.push(s.charAt(i));
            }
        }
        return stack.isEmpty();
    }

    public int longestValidParentheses2(String s) {
        if (s.length() <= 1) {
            return 0;
        }
        int max = 0;
        int[] dp = new int[s.length()];
        dp[0] = 0;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == ')') {
                // ... ()
                if (s.charAt(i - 1) == '(') {
                    if (i - 2 >= 0) {
                        dp[i] = dp[i - 2] + 2;
                    } else {
                        dp[i] = 2;
                    }
                    // ... ))
                } else if (s.charAt(i - 1) == ')') {
                    if ((i - dp[i - 1] -1 >= 0) && s.charAt(i - dp[i - 1] - 1) == '(') {
                        if (i - dp[i - 1] - 2 >= 0) {
                            dp[i] = 2 + dp[i - 1] + dp[i - dp[i - 1] - 2];
                        } else {
                            dp[i] = 2 + dp[i - 1];
                        }
                    }
                }
            }
            max = Math.max(max, dp[i]);
        }
        return max;

    }






}
发布了187 篇原创文章 · 获赞 26 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/huangdingsheng/article/details/103809818
今日推荐