leetcode32 Longest Valid Parentheses

问题描述

* 找出字符串中最长的有效子串,字符串只包括'(' , ')'。何为有效,可参考leetcode20 判断一个字符串是否为有效字符串。

解题思路

介绍动态规划的解法

  1. 从倒数第二个元素往前遍历,特别针对 " ( ) " 的情况。
  2. 用一维数组保存结果,d[i] 代表从当前下标 i 到字符串 s 最末尾的子串中的最长有效子串的长度。
  3. 动态方程如何写呢?
  4. 对于当前下标i,如果是 ' ( ',则考虑右边子串中的元素,是否为 ' )'。考虑哪一个呢? symi 变量是怎么想到的呢?后来我思考发现,发现原作设置的 symi 变量确实巧妙。symi 代表对于当前下标i,需要进行匹配的右括号的位置。此时若是匹配,则得到的 d[i] 代表从 i 到 symi 之间的子串的最长有效子串长度,如果下标 symi 右边还有元素。则需要加上 d[symi+1]。
  5.  
       
     1 public class Solution {
     2     public int longestValidParentheses(String s) {
     3         if(null == s) return 0;
     4         int len = s.length(), max = 0;
     5         int[] d = new int[len];
     6         for (int i = len-2; i >= 0; i--){
     7             int symi = i+1+d[i+1];
     8             if ('(' == s.charAt(i) && symi < len && ')' == s.charAt(symi)){
     9                 // 如果满足条件,则相当于在d[i+1]的基础上又多了一对"()",所以长度+2
    10                 d[i] = d[i+1]+2;
    11                 // 如果symi右边还有元素,那么d[i]就应该加上d[symi+1]
    12                 if(symi+1 < len){
    13                     d[i] += d[symi+1];
    14                 }
    15             }
    16             max = Math.max(max, d[i]);
    17         }
    18         return max;
    19     }
    20 }

     

转载于:https://www.cnblogs.com/dogeLife/p/11000444.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值