Longest Valid Parentheses

来源:互联网 发布:淘宝子账号手机登陆 编辑:程序博客网 时间:2024/04/30 06:42

Longest Valid Parentheses

动态规划

思路一(未实现):

从右端开始遍历,寻找 '(' 到末尾所构成的最大长度,根据存储的dp数组跳跃判断


思路二(python实现):

类似思路一,只不过遍历的时候不找全局最大,而是局部最大,类似贪心,存储之后再返回计算

具体过程如下:

) ( ) ( ( ( ) ) ( ( ( ) ( ) ) )

0121112411121268

第一行为给定的字符串,第二行为计算时存储的dp数组

从左侧开始遍历,遇到 '(' 就存储 1 ,遇到 ')' 的时候判断:

前一个数是1,则存储2(代表这个右括号构成了一个长度为2的合法括号对)

如果前一个数是0,说明前面为一个非法的右括号,那么当前位置也非法(前面没有左括号匹配了),也存储0

如果前一个数大于1,记为n,说明前面是匹配好的右括号,而且长度为n,这时查看再向前n步的位置的值,是0,1,还是大于1,重复上面步骤

如果一直大于1,则循环,否则,如果遇到0,则该位置存储0,遇到1,那么该位置存储一共跳过的位置再加2(此时该位置的右括号再远处找到了可以匹配的左括号)

遍历结束后得到上面的dp数组

这时开始计算最大值:

从后面开始遍历,遇到大于1的值,说明这一段连续的括号已经匹配,计入临时遍历count,此时游标向前跳该值那么多步(跳转到这段合法的括号前面一个位置)

如果遇到的还是大于1的值,循环寻找,并加入count

知道遇到1或者0,说明该段合法的括号与再前面的不构成更长的匹配括号,此时的count与ans比较,ans中存储较大者,count清零,游标前移一位,继续寻找,直到数组开头


例子(加粗为游标位置):

0121112411121268

count = 8  ans = 8


0121112411121268

count = 12  ans = 12


0121112411121268

count = 0  ans = 12


0121112411121268

count = 2  ans = 12


0121112411121268

count = 0  ans = 12

最终得到最大值为12

0 0