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;
}
}
LeetCode--32--hard--LongestValidParentheses
猜你喜欢
转载自blog.csdn.net/huangdingsheng/article/details/103809818
今日推荐
周排行