括号孤点问题32. Longest Valid Parentheses

这真的是一道很难的题,通过率也很低。
首先一点基本认识:
如果我们从左往右统计括号的数量,如果某刻右括号的数量大于了左括号的数量,则我们不能跨过这最后一个右括号。
如果我们从右往左统计括号的数量,如果某刻左括号的数量大于了右括号的数量,刚我们不能跨过这最后一个左括号。
所以这个问题就必须在这样的点被分割。
这样的点我把它叫做孤点。(原创理论,可能别处早就有类似或者更好的,但我没读过)
(() 第一个括号就是一个孤点
())最后一个括号就是一个孤点。
())()) 第三个,第六个都是孤点。

如果你把孤点都求出来,找孤点间的最大间隔就可以了。
因为孤点前的最后一个点肯定是左右平衡的(如果不是两个孤点挨着的话)

public int longestValidParentheses(String s) {
        boolean[] singlePoints = new boolean[s.length()];
        int l = 0, r = 0;
        for (int i = 0; i < s.length(); i++) {
            int dummy = s.charAt(i) == '(' ? (l++) :(r++);
            if (r > l) {
                singlePoints[i] = true;
                r = 0;
                l = 0;
            }
        }
        l = 0;
        r = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            int dummy = s.charAt(i) == ')' ? (r++) : (l++);
            if (l > r) {
                singlePoints[i] = true;
                r = 0;
                l = 0;
            }
        }
        int best = 0, count = 0;
        for (boolean b : singlePoints) {
            if (!b) {
                count++;
            } else {
                best = Math.max(best, count);
                count = 0;
            }
        }
        best = Math.max(best, count);
        return best;
    }

你可能感兴趣的:(括号孤点问题32. Longest Valid Parentheses)