给定一个字符串,求出最长的连续配对括号子串的长度

这个是在leetcode刷题的时候碰到的,被折磨了很久,所以印象比较深刻,拿出来说说,原题在
https://leetcode.com/problems/longest-valid-parentheses/
主要的意思是说,给定一个字符串,只包含左右括号( ),寻找最长的配对的子串并求其长度。比如”(()”最长配对是”()”,返回长度2;”)()()”最长配对子串是”()()”,返回长度4;

这个题目实际的复杂度比看起来要高,除了对各种输入串要返回正确结果外,对于一些复杂输入,比如前面 2000个(后面跟一个),如何实现快速的收敛,是很重要的,我的第一个递归算法,就是因为收敛太慢超过了运行的时间要求,最后只好放弃了。
最终的算法思想如下:
首先寻找两个相邻的最近的(),它们肯定是配对的;然后找后面的),有两个合法的情况,一是前面有相邻的配对的(,二是)和上一个(之间只有已经配对的(),否则都是不配对的情况;为了简单起见,我们把已经配对的()用一个特殊字符替换,以简化判断逻辑。代码如下:

public int longestValidParentheses(String s) {
    int index = 0;
    char[] ca = s.toCharArray();
    int prev;
    int maxLen = 0;
    int len;

    while (indexlength) {
        while (indexlength && ca[index]!=')')
            index++;
        if (index==ca.length)
            break;
        prev = index-1;
        while (prev>=0 && ca[prev]=='-')
            prev--;
        if (prev>=0 && ca[prev]=='(') {
            ca[prev] = '-';
            ca[index] = '-';
        }
        index ++;
    }

    index = 0;
    while (indexlength) {
        while (indexlength && ca[index]!='-')
            index++;
        if (index==ca.length)
            break;
        int start = index;
        while (indexlength && ca[index]=='-')
            index++;
        len = index-start;
        if (len>maxLen)
            maxLen = len;
    }

    return maxLen;
}

你可能感兴趣的:(给定一个字符串,求出最长的连续配对括号子串的长度)