此题还可以用dp做
public class Num32最长有效括号 {
public int longestValidParentheses(String s) {
char[] arr = s.toCharArray();
char[] reverseArr = new char[arr.length];
for (int i = arr.length - 1, k = 0; i >= 0; )
reverseArr[k++] = arr[i--];
for (int i = 0; i < reverseArr.length; i++)
//将(换成)因为只有最后一位不同,所以异或1即可
reverseArr[i] ^= 1;
return Math.max(helper(arr), helper(reverseArr));
}
//括号序列性质:所有前缀和必须大于等于0,最终的和必须等于0
//(是1,)是-1
private int helper(char[] array) {
int res = 0;
for (int i = 0, start = 0, cnt = 0; i < array.length; i++) {
if (array[i] == '(') {
cnt++;
} else {
cnt--;
if (cnt < 0) {
start = i + 1;
cnt = 0;
} else if (cnt == 0) {
res = Math.max(res, i - start + 1);
}
}
}
return res;
}
}