LeetCode32. Longest Valid Parentheses

传送门: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 }

 

posted @ 2019-11-30 22:55  FanJiaming  阅读(148)  评论(0编辑  收藏  举报