32. 最长有效括号(括号序列性质,前缀和)

253 阅读1分钟

此题还可以用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;
    }
}