主要利用了有效序列是连续的性质
class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack=new Stack<Integer>();//存贮左括号的索引
int max=0;
int start=0;//有效序列的起点,关键变量
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='('){
stack.push(i);
}else{
if(stack.isEmpty()){//key.被多余的右括号阻断
start=i+1;
continue;
}else{
stack.pop();
}
max=stack.isEmpty()?Math.max(max,i-start+1):Math.max(max, i-stack.peek());//key,arr[start,i],arr[stack.peek()+1,i]
}
}
return max;
}
//32. Longest Valid Parentheses 最长有效圆括号序列的长度,输入只包含字符')'和'('。eg")()())"-->"()()",返回4。
//相当枚举跳跃有效序列的头.eg:)(())(()()))(
public int longestValidParenthesesOrignal(String s) {
Stack<Integer> stack=new Stack<Integer>();//存贮左括号的索引
int max=0;
int start=0;//有效序列的开始,关键变量
int i=0;
//1.找第一个有效起点
while(i<s.length() && s.charAt(i)==')'){
i++;
}
start=i;
//遇左括号则进栈,与到一个右括号就弹一个左括号
while(i<s.length()){
if(s.charAt(i)=='('){
stack.push(i);
}else{//遇到')'
if(stack.isEmpty()){
start=i+1;//arr[start,i]出现的总右括号数大于总左括号数,以start为开头已经无法再延伸形成一个更长的有效序列,于是换start
}else{
stack.pop();
max=stack.isEmpty()?Math.max(max,i-start+1):Math.max(max, i-stack.peek());//key,利用有效序列是连续的,计算当前有效序列长度
}
}
i++;
}
return max;
}
}