您的位置:首页 > 其它

LeetCode-Longest Valid Parentheses

2014-06-10 16:17 357 查看
作者:disappearedgod
文章出处:/article/3730144.html
时间:2014-6-10

题目


Longest Valid Parentheses

Total Accepted: 9583 Total
Submissions: 50640My Submissions

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.

解法

非DP解法

public class Solution {
public int longestValidParentheses(String s) {
Queue<Integer> q = new LinkedList<Integer>();
int count = 0;
int result = 0;
if(s.length()<2)
return result;
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(c=='(')
q.offer(++count);
if(c==')' && !q.isEmpty())
result = q.poll()*2;
}
return result;
}
}


Input:"()(()"
Output:4
Expected:2

DP算法

这道题可以用一维动态规划逆向求解。假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[i]到s[s.length - 1]最长的有效匹配括号子串长度。则存在如下关系:

dp[s.length - 1] = 0;
从i - 2 -> 0逆向求dp[],并记录其最大值。若s[i] == '(',则在s中从i开始到s.length - 1计算s[i]的值。这个计算分为两步,通过dp[i + 1]进行的(注意dp[i + 1]已经在上一步求解):

在s中寻找从i + 1开始的有效括号匹配子串长度,即dp[i + 1],跳过这段有效的括号子串,查看下一个字符,其下标为j = i + 1 + dp[i + 1]。若j没有越界,并且s[j] == ‘)’,则s[i ... j]为有效括号匹配,dp[i] =dp[i + 1] + 2。
在求得了s[i ... j]的有效匹配长度之后,若j + 1没有越界,则dp[i]的值还要加上从j + 1开始的最长有效匹配,即dp[j + 1]。

public class Solution {
public int longestValidParentheses(String s) {
int result = 0;
int len = s.length();
int[] dp = new int[len];// store the location of ')' macthed
char c = 0;
//initialize dp with 0 in JAVA
for(int i = len -2 ; i >= 0 ; i-- ){
c = s.charAt(i);
if(c=='('){
int j = i + 1 + dp[i+1];//find the location of ')', which matches '('
if(j < len &&  s.charAt(j) == ')'){// match = no overflow and get the ')'
dp[i] = dp[i+1] +2;// (())
int flag = 0;
if(j + 1< len ){ // Adding the result of the next'(',for example()()
flag = dp[j +1];
}
dp[i] += flag;
}
}
result = Math.max(result, dp[i]);
}
return result;
}
}


参考 http://blog.csdn.net/abcbc/article/details/8826782
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: