zoukankan      html  css  js  c++  java
  • 32. Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

    Example 1:

    Input: "(()"
    Output: 2
    Explanation: The longest valid parentheses substring is "()"
    

    Example 2:

    Input: ")()())"
    Output: 4
    Explanation: The longest valid parentheses substring is "()()"


     1 class Solution {
     2     
     3     public int longestValidParentheses(String s) {
     4         int n = s.length();
     5         int []f = new int[n];
     6         int []stack = new int[n];
     7         int ans = 0;
     8         int k = 0;
     9         for (int i = 0; i < n; ++i) {
    10             if (s.charAt(i) == '(') {
    11                 stack[k++] = i;
    12             }
    13             if (s.charAt(i) == ')') {
    14                 if (k > 0) {
    15                     f[i] = i - stack[k - 1] + 1;
    16                     if (stack[k - 1] - 1 >= 0 && f[stack[k - 1] - 1] > 0)
    17                         f[i] += f[stack[k - 1] - 1];
    18                     k--;
    19                 } else {
    20                     k = 0;
    21                     
    22                 }
    23                 
    24             }
    25         }
    26         for (int i = 0; i < n; ++i) {
    27             ans = Math.max(ans, f[i]);
    28         }
    29         
    30         return ans;
    31     }
    32 }
     1 public class Solution {
     2 
     3     public int longestValidParentheses(String s) {
     4         int n = s.length();
     5         int []dp = new int[n + 1];
     6         for (int i = 0; i < n; ++i) {
     7             if (s.charAt(i) == ')') {
     8                 if (i - 1 >= 0 && s.charAt(i - 1) == '(') {
     9                     
    10                     dp[i + 1] = 2 + dp[i - 2 + 1];
    11                     
    12                 }
    13                 if ( i - 1 - dp[i] >= 0 && s.charAt(i - 1 - dp[i]) == '(') {
    14                     dp[i + 1] = Math.max(dp[i + 1], 2 + dp[i] + dp[i - 1 - dp[i]] );
    15                 }
    16                 
    17             }
    18         }
    19         int ans = 0;
    20         for (int i = 1; i <= n; ++i) ans = Math.max(ans, dp[i]);
    21         //for (int i = 1; i <= n; ++i) System.out.print(dp[i] + " ");
    22         return ans;
    23     }
    24 }
     1 public class Solution {
     2 
     3     public int longestValidParentheses(String s) {
     4         int n = s.length();
     5         int left = 0, right = 0;
     6         int ans = 0;
     7         for (int i = 0; i < n; ++i) {
     8             if (s.charAt(i) == '(') left++;
     9             if (s.charAt(i) == ')') right++;
    10             if (left == right) {
    11                 ans = Math.max(ans, 2*left);
    12             } else if(left < right) {
    13                 left = 0;
    14                 right = 0;
    15                 
    16             }
    17         }
    18         left = right = 0;
    19         for (int i = n - 1; i >= 0; --i) {
    20             if (s.charAt(i) == '(') left++;
    21             if (s.charAt(i) == ')') right++;
    22             if (left == right) {
    23                 ans = Math.max(ans, 2*left);
    24             } else if(left > right) {
    25                 left = 0;
    26                 right = 0;
    27                 
    28             }
    29         }
    30         return ans;
    31     }
    32 }
  • 相关阅读:
    数据结构和算法大纲
    内存碎片产生原因及处理技术
    相关资源
    busybox hexdump 命令使用
    http协议中content-length 以及chunked编码分析
    libtool工具的使用
    音视频学习相关资源
    winpcap
    ipkg包管理
    system返回值校验
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/12309467.html
Copyright © 2011-2022 走看看