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]。