zoukankan      html  css  js  c++  java
  • LeetCode32 Longest Valid Parentheses

    题目:

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

    For "(()", the longest valid parentheses substring is "()", which has length = 2.

    Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4. (Hard)

    分析:

    题意是找到最长的合法括号字串。

    看着就很想动态规划的题目,但是开始考虑的是dp[i][j]记录i到j是否是合法串。但是递推关系没法找。

    想到应该是符合单序列动态规划的情况,用dp[i]表示以i结尾的最长合法括号串的长度。

    递推关系如下:

    如果 s[i] == '('  则 dp[i] = 0;

    如果 s[i] == ')'  则

      如果 s[i - 1] == '(' 则 dp[i] = dp[i - 2] + 2;

      如果 s[i - 1] == ')' 则需要记录 j = dp[i - 1],并判断 s[i - 1 - j] 也就是从后往前数第一个不符合的字符的情况。

            如果s[i - 1- j] == '('   则 dp[i] = dp[i - j -2] + dp[i - 1] + 2;  // i-j-2位置向前合法的,加上i-1位置向前合法的,加上s[i-j-1]和s[i]配对的2;

            如果s[i - 1 - j]不存在或者为 ')' 则 s[i] = 0;

    求出不等于0的dp[i]时更新result。

    把上述递推关系实现代码如下:

     1 class Solution {
     2 public:
     3     int longestValidParentheses(string s) {
     4         if (s.size() == 0 || s.size() == 1) {
     5             return 0;
     6         }
     7         int result = 0;
     8         int dp[s.size()] = {0};
     9         if (s[1] == ')' && s[0] == '(') {
    10             dp[1] = 2;
    11             result = 2;
    12         } 
    13         for (int i = 1; i < s.size(); ++i) {
    14             if (s[i] == '(') {
    15                 dp[i] = 0;
    16             }
    17             if (s[i] == ')') {
    18                 if (s[i - 1] == '(') {
    19                     dp[i] = dp[i - 2] + 2;
    20                     result = max(result,dp[i]);
    21                 }
    22                 if (s[i - 1] == ')') {
    23                     int j = dp[i - 1];
    24                     if (i - j - 1 >= 0 && s[i - j - 1] == '(') {
    25                         dp[i] = dp[i - 1] + dp[i - j - 2] + 2;
    26                         result = max(result,dp[i]);
    27                     }
    28                     else {
    29                         dp[i] = 0;
    30                     }
    31                 }
    32             }
    33         }
    34         return result;
    35     }
    36 };
  • 相关阅读:
    数据分析实战(4)-Kaggle-谷歌数据分析
    东财主力资金异动数据探索分析
    数据分析实战(2)-Kaggle-共享单核数据分析
    爬虫框架Scrapy 之(二) --- scrapy文件介绍
    爬虫框架Scrapy 之(一) --- scrapy整体认识
    atomic
    坑爹的缩写
    一些坑爹的结构体
    sensor hub
    android p 常识
  • 原文地址:https://www.cnblogs.com/wangxiaobao/p/5797014.html
Copyright © 2011-2022 走看看