import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class test_04_25 {//翻转字符串里的单词// hello worldpublic static String reverseWords(String s){int i=0;int j=0;List<String> res = new ArrayList<>();while (j<s.length()){//将头部的空字符串跳过i = skipSpace(s, i);j=i;if (j>=s.length()){break;}while (j<s.length()&&s.charAt(j)!=' '){j++;}res.add(s.substring(i,j));i=j;}Collections.reverse(res);String myRes = "";for (int p=0;p<res.size();p++){if (p!=0){myRes = myRes +" "+res.get(p);}else{myRes = myRes+res.get(p);}}return myRes;}public static int skipSpace(String s, int i) {while (i<s.length()&&s.charAt(i)==' '){i++;}return i;}//[1,2,3]//子集-获取子集public List<List<Integer>> subsets(int[] nums){//总共的情况数int n = (int) Math.pow(2,nums.length);List<List<Integer>> res = new ArrayList<>();for (int i=0;i<n;i++){List<Integer> ls = new ArrayList<>();for (int j=0;j<nums.length;j++){if (((i>>j)&1)==1){ls.add(nums[j]);}}res.add(ls);}return res;}//字符串相乘//num1 = "123", num2 = "456"public static String multiply(String num1, String num2){List<String> ls = new ArrayList<>();String m = "";for (int i=num1.length()-1;i>=0;i--){ls.add(multiplyString(num1.charAt(i),num2)+m);m = m+"0";}String res="0";for (int i=0;i<ls.size();i++){res = addString(res,ls.get(i));}int pos=0;for (;pos<res.length();pos++){if (res.charAt(pos)=='0'){pos++;}else{break;}}if (pos>=res.length()){return "0";}else{return res.substring(pos);}}public static String multiplyString(char c, String num2) {int k=0;StringBuilder stringBuilder = new StringBuilder();for (int i=num2.length()-1;i>=0;i--){int res = ((c - 48) * (num2.charAt(i) - 48) + k);k = res/10;stringBuilder.append(res%10);}if (k!=0){stringBuilder.append(k);}stringBuilder.reverse();return stringBuilder.toString();}//字符串相加public static String addString(String num1, String num2){int i=num1.length()-1;int k=0;int j=num2.length()-1;StringBuilder stringBuilder = new StringBuilder();while (i>=0&&j>=0){int res = num1.charAt(i)+num2.charAt(j)-48-48+k;k = res/10;stringBuilder.append(res%10);i--;j--;}while (i>=0){int res = num1.charAt(i)-48+k;k = res/10;stringBuilder.append(res%10);i--;}while (j>=0){int res = num2.charAt(j)-48+k;k=res/10;stringBuilder.append(res%10);j--;}if (k!=0){stringBuilder.append(k);}stringBuilder.reverse();return stringBuilder.toString();}//最长有效括号//")()())"public static int longestValidParentheses(String s) {//")()())"//")(())"int n = s.length();//dp[i]表示截至i的最长有效括号int[] dp = new int[n+1];int max=0;for (int i=1;i<n;i++){if (s.charAt(i)=='('){dp[i]=0;}else{if (s.charAt(i-1)=='('){if (i>=2){dp[i]=dp[i-2]+2;}else{dp[i]=2;}}else{//(())int index = i-dp[i-1]-1;if (index>=0){if (s.charAt(index)=='('){System.out.println(i+"-"+index);dp[i]=dp[i-1]+2+dp[index]+dp[index-1>=0?index-1:n];}else{dp[i]=0;}}else{dp[i]=0;}}}max=Math.max(max,dp[i]);}return max;}public static void main(String[] args) {int i = longestValidParentheses("(()");System.out.println(i);}}