• LeetCode32. Longest Valid Parentheses


    传送门:https://leetcode.com/problems/longest-valid-parentheses/

    题意:给出一个由括号'('与')'组成的字符串,找出最长合法连续子串的长度

    思路:首先需要注意的是,子串要是连续的,然后按顺序一个'('匹配一个')',比如"()()()","((()))",都是合法的。

      不难看出,此题具有最优子结构性质,且无后效性,若s[j]为')',s[i]='('是与s[j]匹配的'(',s[i:j]是合法串,则以j结尾的合法子串为以s[i - 1]结尾的合法字串接上s[i : j]。

      对于i = j - 1的情况,我们可以给出状态转移方程len[j] = 2 + (i - 1 >= 0 ? len[i - 1] : 0)

      对于i != j - 1的情况,我们可以给出状态转移方程len[j] = 2 + len[j - 1] + (i - 1 >= 0 ? len[i - 1] : 0)

      接下来我们结合实际编码对转移方程进行优化,因'('与')'必须成对出现,将上面的>=换成>,在实际编码中我们发现对于i!=j的情况,下面的式子依然成立,因为'('对应的数组我们设为0,于是我们可以给出以下解决方案,看了下和discuss区一个代码很类似,编码差不多真挺意外的,都可以被判重了。

     1 public class Solution {
     2     public int longestValidParentheses(String s) {
     3         int ans = 0;
     4 
     5         int len[] = new int[s.length() + 1];
     6         int l = 0;
     7         for(int i = 0; i < s.length(); ++i) {
     8             if(s.charAt(i) == '(') ++l;
     9             else if(l > 0) {
    10                     len[i] = 2 + len[i - 1] + (i - 2 - len[i - 1] > 0 ? len[i - 2 - len[i - 1]] : 0);
    11                 --l;
    12                 ans = Math.max(ans, len[i]);
    13             }
    14         }
    15 
    16         return ans;
    17     }
    18 }
  • 相关阅读:
    导入动态页面的两种方法
    JSTL之c:set
    CentOS更新源
    MVC轻量web应用
    Linux设备驱动开发流程(转)
    g++: internal compiler error: Killed (program cc1plus)Please submit a full bug report,内存不足问题解决
    .PHONY的作用
    CMake(转)
    关于a+++++b含义的问题
    返回值为函数指针的函数(转)
  • 原文地址:https://www.cnblogs.com/fan-jiaming/p/11964396.html
Copyright © 2020-2023  润新知