zoukankan      html  css  js  c++  java
  • 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的用户

     

  • 相关阅读:
    ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
    解决VMware安装ubuntu16.04后无法全屏的问题
    力推:无限制下载神器aria2
    使用Pangolon在同一副图中,画出两个轨迹,比较误差
    Pangolin中opengl的混合(gl_blend)
    Ubuntu 16.04: How to install OpenCV
    ubuntu16.04下安装Eigen
    ubuntu16.04下安装Sophus
    svn删除账户信息
    javaweb乱码(tomcat服务器)
  • 原文地址:https://www.cnblogs.com/CHAHA123/p/10630824.html
Copyright © 2011-2022 走看看