码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode32. Longest Valid Parentheses

时间:2019-11-30 23:59:23      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:ems   problems   mat   转移   ble   传送门   tco   tps   color   

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

 

LeetCode32. Longest Valid Parentheses

标签:ems   problems   mat   转移   ble   传送门   tco   tps   color   

原文地址:https://www.cnblogs.com/fan-jiaming/p/11964396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!