您的位置:首页 > 其它

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

2016-09-13 17:01 435 查看
这个是在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 (index<ca.length) {
while (index<ca.length && 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 (index<ca.length) {
while (index<ca.length && ca[index]!='-')
index++;
if (index==ca.length)
break;
int start = index;
while (index<ca.length && ca[index]=='-')
index++;
len = index-start;
if (len>maxLen)
maxLen = len;
}

return maxLen;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐