问给出一串括号 ()))(())..,最长的valid括号组合有多长?(括号组合需要连续)
这道题确实比较麻烦,在这里记录一下错误思路:
①想到的是这道题应该可以用dp做。设dp[i][j]代表从s[i..j]中valid括号组合最大长度。然后如果:
s[i] == '(' and s[j] == ')'
岂不是就可以转化成dp[i+1][j-1]的问题。dp方程是dp[i][j]=dp[i+1][j-1]+2,然后显然错了。
对于用例()(),我这种方式只能找到结果为2的。
然后考虑对DP方程进行了修改。如果不符合上述条件呢?dp[i][j] = max(dp[i+1][j],dp[i][j-1]) 这样就考虑到了这种情况了吧?
但是())()这种情况输出了4,实际上应该输出2. 因为上述dp方程完全没有考虑它是一个substring的问题。
正解如下:
②考虑以i位置结束的字符串,其valid括号组为dp[i]。在dp完成之后遍历一下dp数组,或者使用一个vmax跟踪,就可以得到最大值。
s[i] == ‘(‘,括号组不可能以左括号结束的,此substring的dp[i]=0
s[i] == ‘)’。这种情况要复杂一点。
我们需要找的是这么一个结构 ((xxxxxx)) ,即判断这个右括号,能否被正确配对。
找到这么一个左括号,并且内部xxx被括号包围【因为被括号包围了,故包括括号的长度是dp[i-1]】,((xxxxxx))串中第一个符号的下标j应当是j=i-dp[i-1]-1。
如果此时找不到这么一个左括号,即s[j]==’)’ or j<0【遍历了字符串至出界】,则没有能够与s[i]匹配的括号,则dp[i]=0
如果能找到,即s[j] == ‘(‘,那么dp[i] = dp[i-1] + 2. 比如(()())
b的情况中,还有一种 ()()(()()),即在结构((xxxxxx))的左侧还有串可以连接起来构成更长的串。 判断j-1>=0,则只需要令
dp[i] = dp[i-1] + 2 + dp[j-1]
这样就可以完美解决问题。
栈的做法后续再更新。