使用栈来存储索引,栈顶存储的是最后一个被匹配的‘(’前面的索引,所以得到的结果就是当前的索引(‘)’)减去栈顶的索引,求最大值。为了初始化,避免第一个是‘)’造成异常,初始化栈顶为-1
import java.util.*;


public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int max=0;
    public int longestValidParentheses (String s) {
        // write code here
        int n=s.length();
        if(n<=1){
            return 0;
        }
        char []c=s.toCharArray();
        Deque<Integer> stack=new LinkedList<>();
        stack.push(-1);
        for(int i=0;i<n;i++){
            if(c[i]=='('){
                stack.push(i);  //push的是坐标
            }
            else{
                stack.pop();
                if(stack.isEmpty()){
                    stack.push(i);        //表示能匹配的左括号前面的那个元素
                }
                else{
                    max=Math.max(max,i-stack.peek());  //stack 保存的是最后一个被匹配的’(‘的前面的索引                }
            }
        }
  }
        return max;
    }
   
}