• LeetCode32.最长有效括号


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

    示例 1:

    输入: "(()"
    输出: 2
    解释: 最长有效括号子串为 "()"


    示例 2:

    输入: ")()())"
    输出: 4
    解释: 最长有效括号子串为 "()()"

     1 /*
     2     采用动态规划建立一个与给定字符串长度相等的数组dp,用于记录当前的有效括号长度
     3     1.从下标为1的开始遍历,若当前下标为i的字符为'('时,则跳过(默认置为0)
     4     2.若当前下标为i的字符为')’时,获取dp[]中前一个字符的数值,即dp[i-1],并获取指向的前dp[i-1]个字符下标(跳过有效括号字串,寻找前面未匹配的括号)
     5     3.若有效括号字串的前一个字符为'(',即匹配成功,当前dp[i]获得前一个的数值加二(即dp[i]=dp[i-1]+2,2分别为()括号)
     6     4.判断是否连续的有效括号:获得刚匹配成功的前一个dp数值,查看是否为0(即dp[i-2-dp[i-1]]),若不为0,则相当于连续字串,最后再加上dp[i-2-dp[i-1]].
     7 */
     8 class Solution {
     9     public int longestValidParentheses(String s) {
    10         int len=s.length();
    11         int max=0;
    12         int []dp=new int[len];
    13         for(int i=1;i<len;i++){
    14             //1.
    15             if(s.charAt(i) =='(')
    16                 continue;
    17             //2.
    18             int index=i-1-dp[i-1];
    19             if(index<0)
    20                 continue;
    21             //3.
    22             if(s.charAt(index)=='('){
    23                 dp[i]=dp[i-1]+2;
    24                 int lastindex=i-2-dp[i-1];   
    25                 if(lastindex>=0){
    26                     if(dp[lastindex]!=0)
    27                     dp[i]+=dp[lastindex];
    28                 }
    29             }
    30             if(dp[i]>max)
    31                 max=dp[i];
    32         }
    33         return max;
    34     }
    35 }


  • 相关阅读:
    [编程题] 回文数问题
    [编程题] 以字符串的形式读入两个数字,再以字符串的形式输出两个数字的和
    [编程题] 合并有序链表
    [编程题] 借用栈实现链表反转
    [编程题] 二叉树求深度
    pat 甲级 1045 ( Favorite Color Stripe ) (动态规划 )
    pat 甲级 1034 ( Head of a Gang )
    PAT public bike management (30)
    PAT 甲练习 1003 Emergency
    vim 自动代码格式调整
  • 原文地址:https://www.cnblogs.com/lyh28/p/10512554.html
Copyright © 2020-2023  润新知