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的用户

     

  • 相关阅读:
    Kotlin Native
    大数据技术原理与应用【点个赞】
    TypeScript的概要和简介
    Windows 10 运行原生Bash【Ubuntu】
    Kotlin的参考资料
    Javascript前端和JAVA后端对加密库的处理实例
    bootstrap杂记
    原生JS实现各种经典网页特效——Banner图滚动、选项卡切换、广告弹窗等
    博文目录 | 杰瑞教育原创系列文章目录一览
    MUI框架开发HTML5手机APP(二)--页面跳转传值&底部选项卡切换
  • 原文地址:https://www.cnblogs.com/CHAHA123/p/10630824.html
Copyright © 2011-2022 走看看