传送门:https://leetcode.com/problems/longest-valid-parentheses/
题意:给出一个由括号'('与')'组成的字符串,找出最长合法连续子串的长度
思路:首先需要注意的是,子串要是连续的,然后按顺序一个'('匹配一个')',比如"()()()","((()))",都是合法的。
不难看出,此题具有最优子结构性质,且无后效性,若s[j]为')',s[i]='('是与s[j]匹配的'(',s[i:j]是合法串,则以j结尾的合法子串为以s[i - 1]结尾的合法字串接上s[i : j]。
对于i = j - 1的情况,我们可以给出状态转移方程len[j] = 2 + (i - 1 >= 0 ? len[i - 1] : 0)
对于i != j - 1的情况,我们可以给出状态转移方程len[j] = 2 + len[j - 1] + (i - 1 >= 0 ? len[i - 1] : 0)
接下来我们结合实际编码对转移方程进行优化,因'('与')'必须成对出现,将上面的>=换成>,在实际编码中我们发现对于i!=j的情况,下面的式子依然成立,因为'('对应的数组我们设为0,于是我们可以给出以下解决方案,看了下和discuss区一个代码很类似,编码差不多真挺意外的,都可以被判重了。
1 public class Solution { 2 public int longestValidParentheses(String s) { 3 int ans = 0; 4 5 int len[] = new int[s.length() + 1]; 6 int l = 0; 7 for(int i = 0; i < s.length(); ++i) { 8 if(s.charAt(i) == '(') ++l; 9 else if(l > 0) { 10 len[i] = 2 + len[i - 1] + (i - 2 - len[i - 1] > 0 ? len[i - 2 - len[i - 1]] : 0); 11 --l; 12 ans = Math.max(ans, len[i]); 13 } 14 } 15 16 return ans; 17 } 18 }