这个是在leetcode刷题的时候碰到的,被折磨了很久,所以印象比较深刻,拿出来说说,原题在
https://leetcode.com/problems/longest-valid-parentheses/
主要的意思是说,给定一个字符串,只包含左右括号( ),寻找最长的配对的子串并求其长度。比如”(()”最长配对是”()”,返回长度2;”)()()”最长配对子串是”()()”,返回长度4;
这个题目实际的复杂度比看起来要高,除了对各种输入串要返回正确结果外,对于一些复杂输入,比如前面 2000个(后面跟一个),如何实现快速的收敛,是很重要的,我的第一个递归算法,就是因为收敛太慢超过了运行的时间要求,最后只好放弃了。
最终的算法思想如下:
首先寻找两个相邻的最近的(),它们肯定是配对的;然后找后面的),有两个合法的情况,一是前面有相邻的配对的(,二是)和上一个(之间只有已经配对的(),否则都是不配对的情况;为了简单起见,我们把已经配对的()用一个特殊字符替换,以简化判断逻辑。代码如下:
public int longestValidParentheses(String