给定一个字符串,求出最长的连续配对括号子串的长度
2016-09-13 17:01
435 查看
这个是在leetcode刷题的时候碰到的,被折磨了很久,所以印象比较深刻,拿出来说说,原题在
https://leetcode.com/problems/longest-valid-parentheses/
主要的意思是说,给定一个字符串,只包含左右括号( ),寻找最长的配对的子串并求其长度。比如”(()”最长配对是”()”,返回长度2;”)()()”最长配对子串是”()()”,返回长度4;
这个题目实际的复杂度比看起来要高,除了对各种输入串要返回正确结果外,对于一些复杂输入,比如前面 2000个(后面跟一个),如何实现快速的收敛,是很重要的,我的第一个递归算法,就是因为收敛太慢超过了运行的时间要求,最后只好放弃了。
最终的算法思想如下:
首先寻找两个相邻的最近的(),它们肯定是配对的;然后找后面的),有两个合法的情况,一是前面有相邻的配对的(,二是)和上一个(之间只有已经配对的(),否则都是不配对的情况;为了简单起见,我们把已经配对的()用一个特殊字符替换,以简化判断逻辑。代码如下:
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; }
相关文章推荐
- 给定一个字符串,求出其最长的重复子串的长度
- 给定一个字符串,求它的最长回文子串的长度,并打印出最长回文子串
- 给定一个字符串s,找出s中最长的回文子串,你可以假设s的最大长度是1000。
- 字符串操作问题:查找给定字符串中,连续重复且长度最长的第一个子串
- 给定一个字符串,找到最长的子串的长度没有重复字符
- 找出一个字符串中最长的连续数字子串,输出该字符串及长度
- 求给定的某一个字符串中的最长的没有重复字符的子串的长度
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 回文串是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。现在,对于一个给定的母串 abcdedcb求最长回文子串的长度
- 输入一个字符串A,求其中最长的连续递增子串的长度。例如 "hidefef" 中最长的连续递增子串是 "def" ,长度为 3
- 求一个字符串中最长的非重复连续子串
- 求字符串中最长连续数字子串的长度
- 给定一个字符串,求出其最长的重复子串。
- 用递归算法写一个函数,求字符串最长连续字符的长度,比如aaaabbcc的长度为4,aabb的长度为2,ab的长度为1。
- 求一个字符串中的最长连续子串
- 给定一个字符串,求出其最长的重复子串
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).
- 百度的一个笔试题:求字符串的最长数字子串的长度
- 用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)
- 【微软100题】写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) 功能: 在字符串中找出连续最长的数字串,并把这个串的长度返回