LeetCode_32
题目描述:
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 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的更多相关文章
随机推荐
- elasticsearch local debug环境搭建
最近计划看看elasticsearch的源码,首先得把local debug环境搞定. 下载源码.因为公司产线是5.6.5,所以就下载了5.6.5的代码. 源码编译.先进入到/elasticsearc ...
- Eric Linux - 1 Basic concepts of linux
Computer basic Computer 5 parts CPU Input Output Memory External storage device. CPU RISC: Reduced I ...
- 解决socket.error: [Errno 98] Address already in use问题
如果python中socket 绑定的地址正在使用,往往会出现错误, 在linux下: 则会显示“ socket.error: [Errno 98] Address already in use” 在 ...
- java关键字-final
final特点: 1:这个关键字是一个修饰符,可以修饰类,方法,变量. 2:被final修饰的类是一个最终类,不可以被继承. 3:被final修饰的方法是一个最终方法,不可以被覆盖. 4:被final ...
- Django中信号signals简单使用
在平时的开发过程中,我们会遇到一些特殊的应用场景,如果你想要在执行某种操作之前或者之后你能够得到通知,并对其进行一些你想要的操作时,你就可以用Django中的信号(signals).Django 提供 ...
- 多线程与高并发(四)volatile关键字
上一篇学习了synchronized的关键字,synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile是一个轻量级的同步机制. 前面学习了Java的内存模型,知 ...
- 配置Python虚拟环境
最小化安装的centos7中并没有安装python3 1.安装python3 1)下载安装包: wget https://www.python.org/ftp/python/3.6.2/Python- ...
- BZOJ 1483:[HNOI2009]梦幻布丁(链表启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=1483 题意:中文. 思路:对于每一种颜色,用一个链表串起来,一开始保存一个答案,后面颜色替换的时候再 ...
- Z点餐系统项目下期改进计划
随着计算机应用范围的日益广泛深人,应用软件的规模及复杂程度也日趋大型化.复杂化,这就导致软件开发的方式也从早期的单兵作战式或手工作坊式渐渐转变为集团化.工厂流水 问题: (一)缺乏项目管理系统培训.项 ...
- LightGBM,面试会问到的都在这了(附代码)!
1. LightGBM是什么东东 不久前微软DMTK(分布式机器学习工具包)团队在GitHub上开源了性能超越其他boosting工具的LightGBM,在三天之内GitHub上被star了1000次 ...