leetcode 32.最长有效括号

题目:

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

分析:

这道题在我半年前开始学算法的时候有写过,不过最后绝对是被虐哭了,主要原因就是无法解决当你向下遍历字符串的时候,遇到隔断后再将其消除不能和上一个连续的有效字串合并。

现在在学了一些算法有了基本的功底后,我又来做这道题目了。

首先给出我参考的一个代码:

 1 class Solution {
 2    public int longestValidParentheses(String s) {
 3         if(s==null||s.equals("")){
 4             return 0;
 5         }
 6         int maxLen = 0;
 7         int[] flag = new int[s.length()];
 8         for(int i  = 1;i<s.length();i++){
 9             if(s.charAt(i)==')'){
10                 //寻找该')'之前的最大匹配
11                 if(i - flag[i - 1] - 1 >= 0&&s.charAt(i - flag[i - 1] - 1)=='('){
12                     flag[i] = flag[i - 1] + 2;
13                 }
14                 //将前面不间断匹配加起来
15                 if(i - flag[i] >= 0){
16                     flag[i] += flag[i - flag[i]];
17                 }
18                 maxLen = flag[i]>maxLen?flag[i]:maxLen;
19             }
20         }
21         return maxLen;
22     }
23 }

这段代码转载自leetcode中文网第32题最长有效括号评论区的一位叫JessioJ的用户,不得不承认他的思想非常棒。

也就是从第二个字符开始遍历,当遇到')'后开始判断,首先判断除去中间连续有效位数的前一位是否为‘(’,如果是就执行flag[i]=flag[i-1]+2操作。

然后开始判断隔断flag[i]位之前是否有连续的有效位数,如果有就使这两部分相加。

以下是我整理后的代码:

 1 class Solution32 {
 2        public int longestValidParentheses(String s) {
 3             int len=s.length(); 
 4             if(len<2){
 5                 return 0;
 6             }
 7             int max = 0;
 8             int[] dp=new int[len];
 9             char[] sc=s.toCharArray();
10             for(int n=1;n<len;++n) {
11                 if(sc[n]==')'&&n-dp[n-1]-1>=0) {
12                     if(sc[n-dp[n-1]-1]=='(')
13                         dp[n]=dp[n-1]+2;
14                     if(n-dp[n]>=0)
15                         dp[n]+=dp[n-dp[n]];
16                 }
17                 max=max>dp[n]?max:dp[n];
18             }
19             return max;
20         }
21     }

如有特别的想法可留言评论区谢谢。

***第一段代码转载自leetcode中文网第32题最长有效括号评论区的一位叫JessioJ的用户

 

原文地址:https://www.cnblogs.com/CHAHA123/p/10630824.html