动态规划的思路,和官方题解的思路是一样的。在这里我说说我的思考过程。
一开始我没有直接想到dp数组里的每个元素,代表“以该元素结尾的最长有效长度”,而是我把它定义成“到该元素为止前面字符串里最长有效长度”。比如说:
(  (  )  (  (  (  (  )  )
index   0  1  2  3  4  5  6  7  8
dp arr  0  0  2  2  2  2  2  2  4
dp数组的推算如上:碰到左括号则保持不变,碰到右括号,需要看情况:
如果i-1位是左括号,则可以配对成功,但不一定会增加最长有效长度:如果dp[i-1]是0,则说明前面没有有效括号,则可以直接+2。但dp[i-1]大于0,则说明前面肯定出现了有小括号,这时还不能+2,还要看出现过的是否跟本次产生的配对是否连续,连续了才能最长有效长度+2。比如判断index=7时,虽然和index=6配对了,但dp[6]上是2,说明index=6之前还有一对,但它的位置我们没有记下来,无从判断是否跟本次产生的连续。
那么是否可以看index=5上的位置来判断连续呢?比如:如果index=5上是右括号,就说明是连续的?反例:())))()判断最后一位时就会出错。所以还要再往前看一下。——仅仅是i-1位置是左括号就判断很麻烦。
官方题解里把dp数组元素定义为“包含”该元素为末尾元素的最长有效长度,就巧妙解决了该问题:
(  (  )  (  (  (  (  )  )
index   0  1  2  3  4  5  6  7  8
dp arr  0  0  2  0  0  0  0  2  4
左括号对应的dp数组元素全部置0不用管,因为有效括号不可能以左括号结尾。
碰到右括号,先看i-1位置,如果是左括号,配对成功,要+2,在左括号前一位即dp[i-2]的基础上+2。因为dp[i-2]代表了以i-2元素为结尾的有效字串最长长度。比如判断index=7,index=6位置是左括号,可以配对,但要看dp[5]位置的数字,目前是0,为什么是0,因为index=5的位置是左括号,不可能包含它结尾的有效字串。
而判断index=8时,index=7位置是右括号,而dp[7]的值恰好指明了包含它的有效字串最长度,所以让i直接减去dp[7]的值,跳转到“以index=7为结尾的最长有效字串的更前面”,去看看有没有和index=8配对的左括号。
如果有,则是三部分相加:本次的配对长度(2)+ 前面临接的有效长度 + 本次配对左括号更前面的临接的有效长度。
很可能因为本次的配对,导致两个有效长度合并起来,行程更大的长度,比如:

class Solution {
public:int longestValidParentheses(string s) {vector<int> dp(s.size(), 0);int max = 0;for (int i = 1; i < s.size(); ++i) {if (s[i] == ')') {if (s[i - 1] == '(') {dp[i] = 2 + (i >= 2 ? dp[i-2] : 0);} else if (i - 1 - dp[i-1] >= 0 && s[i - 1 - dp[i-1]] == '('){if (i - 2 - dp[i-1] >= 0) {dp[i] = 2 + dp[i-1] + dp[i - 2 - dp[i-1]];}else {dp[i] = 2 + dp[i-1];}}}if (dp[i] > max) {max = dp[i];}}return max;}
};

作者:zhangkekf
链接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/dong-tai-gui-hua-c-by-zhangkekf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

动态规划是真的难啊坚持相关推荐

  1. 成为阿里 P7 真的难么?

    现在 Java 相关岗位薪资越来越高.涨幅越来越大. 通过职友集数据可以查看,以北京 Java 相关岗位为例,其中 [20k-30k] 薪酬的 Java 工程师,占到了整体从业者的 30.8%! 北京 ...

  2. 电商是真的难做了吗?

    电商是真的难做了吗?还是说我们自己思维固化了? 确实难做了.[呲牙] 但是只要用心,还是能做的. 给大家个小提示,现阶段的电商,一定一定要把标签,人群重视起来.如果不重视人群.标签你会发现慢慢有很多竞 ...

  3. 自考计算机英语难度,自考本科商务英语专业真的难吗

    自考本科商务英语专业真的难吗 在职场上,英语是一门比较重要的语言,很多企事业单位对于商务英语人才的需求量也是越来越大.如果是之前有较好的英语基础的考生,那么选择这个自考本科专业无疑是最好的选择.可是很 ...

  4. 梦幻模拟战 java,梦幻模拟战手游:抽SSR真的难!你抽到几个SSR英雄?

    原标题:梦幻模拟战手游:抽SSR真的难!你抽到几个SSR英雄? NB游戏,娱乐生活!大家好,我是NB.前段时间一直测试狐妖小红娘手游和航海王燃烧意志这两款手游,甚至是网易刚出的神都夜行录也去体验了一把 ...

  5. 都2021年了,年薪50W真的难吗?

    都2021年了,年薪50W真的难吗? 据我了解,程序员想要突破年薪50W的薪资,其实并不难! 而且这个群体还很庞大,稍一出溜,就被别人反超了!!! 大厂中月薪4W+的招聘JD 但是你得有两项硬技能.. ...

  6. 呼声很高的这门语言真的难学吗?

    不少同学很想自学Java,但又不知道从何开始?到底该如何系统地去学?学着学着想放弃了--万事开头难,只要跟着系统的阶段学习方法走,条理会很清晰,学起来会更轻松,其实自学真的没有想象的那么难! 那到底该 ...

  7. 数据结构和算法真的“难”吗?其实也不见得...

    在各个技术社区或者技术上,我们总是喜欢谈论一些高大上的话题,比如高可用架构.人工智能.云原生应用.跨平台框架.区块链.虽然这些时髦的词代表着行业的趋势,但也在无形之间给我们传递着焦虑,我们不知道怎么才 ...

  8. 零基础学习java大数据真的难吗?

    java是一门永不言败的开发语言,随着软件行业的兴盛,现在学习java的人员也是越来越多了,但是想要学好java的话自学是没有那么容易的事情.特别是对于零基础的学员来,所以对于零基础的学员来说都是要参 ...

  9. 中小企业贷款真的难吗?

    (作者:控股江山) 按:此前我发布了一个帖子<中小企业的贷款难真的没有破解之道吗?>(http://user.qzone.qq.com/908961321/blog/1374364431) ...

最新文章

  1. ADO.NET中带参数的Sql语句的陷阱
  2. HTC推出新款VR头显,奇怪的是只在日本销售
  3. 在Visual Studio设置隐藏cmd,GTK程序有效
  4. c++ dll继续使用然后强制删除dll文件_Windows 10系统安全风险,近300个系统执行文件容易遭受劫持攻击...
  5. logstash filter grok 用法
  6. Visual Studio的调试技巧
  7. 江苏单招试题计算机原理及答案,江苏省对口单招计算机组装与维修计算机原理考题分类汇总.docx...
  8. iOS之应用偏好设置
  9. oracle过滤数据,过滤数据 (Oracle Solaris Studio 12.2:性能分析器)
  10. 计算机存储数字,数字串在计算机内的表示与存储
  11. CVPR 2020 | 旷视提出新型人-物交互检测框架,实现当前最佳
  12. luogu1082 [NOIp2012]同余方程 (扩展欧几里得)
  13. python综合应用_班级管理系统
  14. 108-周跳探测之GF
  15. CPU 流水线的前世今生
  16. MySQL 报错:ERROR 1137 (HY000): Can't reopen table: 'tempId'
  17. 儿童定位手表、定位器、老人健康手表的工作原理
  18. 我为什么要写微信公众号
  19. 『玩转Mybatis』Mybatis超强大的动态SQL大全
  20. handler原子锁_spring-boot-starter-current-limiting

热门文章

  1. Building your training into your researcing
  2. 陷入迷茫的时候怎么办呢?
  3. bring your mac everywhere you go
  4. 2021 4 21 管理心得
  5. 三月苏州健康小贴士!!!健康生活从我做起
  6. rice university phd application result
  7. 如果要和外国人做项目,加入一个teams是第一步,就跟我们的企业微信,钉钉差不多
  8. spring boot actuator服务监控与管理
  9. method-dispatch/
  10. Pandas库DataFrame的排序