题目描述:

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

示例 1:

输入: "(()"

输出: 2

解释: 最长有效括号子串为 "()"

示例 2:

输入: ")()())"

输出: 4

解释: 最长有效括号子串为 "()()"


本题还有一个前置题目,详细内容可以点击此链接跳转 LeetCode_20,解决方案可以查看我的这篇CSDN博客 Li-Richard


稍微有点算法基础的同学看到本题时,脑海里第一个想法应该是使用DP来解决该问题,因为觉得应该可以用之前的结论推出后面一个结论,所以我们直接来讨论如何使用DP方法

比如一个字符串")()())",我们先写出对该字符串中以每一个字符为结尾的字符串的最长有效括号的长度

|字符串的每个字符| ) | ( | ) | ( | ) | ) |

| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |

|字符串每个字符的位置| 0 | 1 | 2 | 3 | 4 | 5 |

|以相应字符结尾的最长有效括号的长度| 0 | 0 | 2 | 0 | 4 | 0 | |

(以下以len(i)表示i位置的最大有效括号字符串的长度)

在计算的过程中,如果位置i的字符为'(',则len(i)肯定为0(好好想想为什么)

此时你正在计算len(4),它是')',此时你首先应该看len(3),找到3-len(3)位置的字符看它是否为'(',若是则len(4)=len(3)+2

等等,我们好像算的不对,如果按照我们上面的算法len(4)应该等于2但实际情况应该等于4,我们好像忽略了什么。

再回到上面的分析,我们找到了3-len(3)的位置后,再往前看,len(3-len(3)-1)(意思为3-len(3)位置之前的字符的len)的值不为零,所以我们应该还要叫上这个位置的len,所以len(4)=len(3)+2+len(3-len(3)-1)(写程序时要注意数组下标不要越界)


所以初步的动态转移方程可以归纳为:

dp[i]=dp[i-1]+2+dp[i-1-dp[i-1]-1] (这只是初步的dp方程,没有判断s[i]和s[i-1-dp[i-1]]的情况)

代码如下:

int longestValidParentheses(string s)
{
if (s==""||s.length()==0||s.length()==1)
{
return 0;
}
int len = s.length();
vector<int>dp(len,0);
for (int i = 0; i < len; i++)
{
if (i==0)
{
dp[i] = 0;
}
else
{
if (s.at(i) == '(')
{
dp[i] = 0;
}
else
{
//重点在这
int pre = i - 1 - dp[i - 1];
if (pre >= 0 && s[pre] == '(')
dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
}
}
}
sort(dp.begin(), dp.end());
return dp[len - 1];
}

LeetCode_32的更多相关文章

随机推荐

  1. Qt:移动无边框窗体(使用Windows的SendMessage)

    移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...

  2. 非常简单的利用CreateProcess注入DLL的方法

    TCHAR szDll[] = TEXT("d:\\test.dll"); STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; ...

  3. hadoop之hive&hbase互操作

    大家都知道,hive的SQL操作非常方便,但是查询过程中需要启动MapReduce,无法做到实时响应. hbase是hadoop家族中的分布式数据库,与传统关系数据库不同,它底层采用列存储格式,扩展性 ...

  4. 使用spring容器干掉if-else

    spring容器干掉if-else 场景说明 最近新做一个项目,需要对不同店铺的商品做不同处理.例如storeA需要进行handleA操作,storeB需要进行handleB操作,如此类推 大家很容易 ...

  5. Laravel --- 【转】安装调试利器 Laravel Debugbar

    [转]http://www.tuicool.com/articles/qYfmmur 1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显 ...

  6. PWN菜鸡入门之栈溢出 (2)—— ret2libc与动态链接库的关系

    准备知识引用自https://www.freebuf.com/articles/rookie/182894.html 0×01 利用思路 ret2libc 这种攻击方式主要是针对 动态链接(Dynam ...

  7. 【MySQL插入更新重复值】ON DUPLICATE KEY UPDATE用法

    要插入的数据  与表中记录数据的 惟一索引或主键中产生重复值,那么就会发生旧行的更新 弊端:造成主键自增不连续.适合数据量不大的表. ON DUPLICATE KEY UPDATE后面的条件 eg有如 ...

  8. html、jsp页面标签的遍历

    应用场景:最近的项目中二级子页面遍历生成.操作表格比较多,记录一下一直用的遍历方法. 一般此类表格都是通过ajax请求数据,然后从callbackFunction中获取数据集合,遍历生成表: eg: ...

  9. redis在asp.net 中的应用

    1.redis介绍 Nosql数据库作为关系型数据库的补充,在互联网公司已经得到广泛的运用.redis便是其中的代表之一,redis是一种(key,value)基于内存的数据库,并支持多种数据结构,如 ...

  10. python查询elasticsearch(Query DSL) 实例

    import datetime import sys import getopt import hashlib from elasticsearch import Elasticsearch &quo ...