leetcode32,最长有效括号

https://leetcode-cn.com/problems/longest-valid-parentheses/

这题用动态规划,但是那个递归公式才是最难的。

先定义dp[i]的含义:以第i个字符为尾的最长有效括号的长度。

题解中分了两种情况:

1. 倒数第二个为(,即..........(),这种情况,dp[i]=dp[i-2]+2;

简单想一下,倒数第一能和其他的(  匹配吗,显然不能,否则倒数第二个匹配个寂寞啊。

 

2. 倒数第二个为 ),即 .....(.....)),对于这种情况,为了最长,那么肯定。。。。。东西啊一定要写出来才发现tm自己说不通

注意倒数第二个  )  匹配的部分用绿色表示了,显然最右边的  ) 是不可能和绿色范围内的 (    匹配的,这一点一点更要想明白!!!

因为绿色范围内的 (   最多匹配倒数第二个   )。这个地方我还没办法讲的很清楚hhhhh

证明:

设  i,j,k,h为上面的括号字符串中的位置。且(i,k)为以k为尾的最长有效子串。

那么反证法:假设(i,k)中的 j 与 h匹配,那么[ j+1,k ] 必定也是有效子串,又因为[i,k]为有效表达式,所以[ i, j ]必定也是有效表达式,那么就出现错误了,因为j作为左括号无法当作有效表达式的最右边的元素。

希望大家好好理解这个证明过程。

 

所以唯一可能就是和 i  之前的匹配了。

会是除了i-1其他的位置吗?

这里也需要用反证法来证明一下。

如果 a与h匹配,那么[a,h]作为有效表达式,则[a+1,h-1]也就是[a+1,k]也必然是有效表达式,

而[i,k]也是有效表达式,那么[a+1,i-1]也是有效表达式,那么就产生矛盾了。

因为【a+1,i-1】,【i,k】都是有效表达式,则可以合并的啊,也就是【a+1,k】,与问题的设定矛盾。

所以不可能是i-1之前的其他位置。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果a等于 i-1呢?  【a+1,k】可就是咱们问题设定的 【i,k】了,也就没矛盾了。

所以当且仅当 第 i-1个元素为( 时,才能和 h位置匹配。否则dp[h]=0;

而且,注意这个时候最长的不是 dp[k]+2,而是  dp[i-2]+2+dp[k],当然了,k-i+1=dp[k]。

 

 

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值