# leetCode 32.Longest Valid Parentheses (有效的最大括号) 解题思路和方法

451人阅读 评论(0)

Longest Valid Parentheses

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.

	    public int longestValidParentheses(String s) {
int len = s.length();
if(len <= 1){
return 0;
}
int startLen;
int validLen = 0;
//长度为偶数
if((len & 1) == 0){
startLen = len;
}else{
startLen = len -1;
}
boolean isBreak = false;
while(startLen > 0){
if(isBreak) break;
for(int i = 0; i + startLen <= len; i++){
String temp = s.substring(i,i+startLen);
int k = lenValid(temp);
if(k > validLen){
validLen = k;
isBreak = true;
break;
}
}
startLen -= 2;
}
return validLen;
}
//str是否有效括号，有效返回len,无效返回-1
private int lenValid(String str){
Stack<Character> st = new Stack<Character>();
for(int i = 0; i< str.length();i++){
if(st.isEmpty() || st.peek() != '(' || str.charAt(i) != ')'){
st.push(str.charAt(i));
}else{
st.pop();
}
}
if(st.isEmpty()){
return str.length();
}
return -1;
}

    public int longestValidParentheses1(String s) {
Stack<Character> st = new Stack<Character>();//保存()
Stack<Integer> si = new Stack<Integer>();//保存()的索引
si.push(-1);//将-1作为一个分界起始值
for(int i = 0; i < s.length(); i++){
if(st.isEmpty() || st.peek() != '(' || s.charAt(i) != ')'){
st.push(s.charAt(i));//入栈
si.push(i);
}else{
st.pop();//出栈
si.pop();
}
}
//si.push(s.length()-1);
//每一个未出栈的元素都是各个有效组的分界点
int end = s.length();//起始点
int max = 0;//最大长度
while(!si.isEmpty()){
int start = si.pop();
max = end - start - 1 > max ? end - start -1:max;
end = start;
}
return max;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：84203次
• 积分：2040
• 等级：
• 排名：第18855名
• 原创：125篇
• 转载：8篇
• 译文：0篇
• 评论：16条
文章分类
阅读排行
最新评论