动态规划是真的难啊坚持
動(dòng)態(tài)規(guī)劃的思路,和官方題解的思路是一樣的。在這里我說(shuō)說(shuō)我的思考過(guò)程。
一開始我沒(méi)有直接想到dp數(shù)組里的每個(gè)元素,代表“以該元素結(jié)尾的最長(zhǎng)有效長(zhǎng)度”,而是我把它定義成“到該元素為止前面字符串里最長(zhǎng)有效長(zhǎng)度”。比如說(shuō):
( ?( ?) ?( ?( ?( ?( ?) ?)
index ? 0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8
dp arr ?0 ?0 ?2 ?2 ?2 ?2 ?2 ?2 ?4
dp數(shù)組的推算如上:碰到左括號(hào)則保持不變,碰到右括號(hào),需要看情況:
如果i-1位是左括號(hào),則可以配對(duì)成功,但不一定會(huì)增加最長(zhǎng)有效長(zhǎng)度:如果dp[i-1]是0,則說(shuō)明前面沒(méi)有有效括號(hào),則可以直接+2。但dp[i-1]大于0,則說(shuō)明前面肯定出現(xiàn)了有小括號(hào),這時(shí)還不能+2,還要看出現(xiàn)過(guò)的是否跟本次產(chǎn)生的配對(duì)是否連續(xù),連續(xù)了才能最長(zhǎng)有效長(zhǎng)度+2。比如判斷index=7時(shí),雖然和index=6配對(duì)了,但dp[6]上是2,說(shuō)明index=6之前還有一對(duì),但它的位置我們沒(méi)有記下來(lái),無(wú)從判斷是否跟本次產(chǎn)生的連續(xù)。
那么是否可以看index=5上的位置來(lái)判斷連續(xù)呢?比如:如果index=5上是右括號(hào),就說(shuō)明是連續(xù)的?反例:())))()判斷最后一位時(shí)就會(huì)出錯(cuò)。所以還要再往前看一下。——僅僅是i-1位置是左括號(hào)就判斷很麻煩。
官方題解里把dp數(shù)組元素定義為“包含”該元素為末尾元素的最長(zhǎng)有效長(zhǎng)度,就巧妙解決了該問(wèn)題:
( ?( ?) ?( ?( ?( ?( ?) ?)
index ? 0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8
dp arr ?0 ?0 ?2 ?0 ?0 ?0 ?0 ?2 ?4
左括號(hào)對(duì)應(yīng)的dp數(shù)組元素全部置0不用管,因?yàn)橛行Юㄌ?hào)不可能以左括號(hào)結(jié)尾。
碰到右括號(hào),先看i-1位置,如果是左括號(hào),配對(duì)成功,要+2,在左括號(hào)前一位即dp[i-2]的基礎(chǔ)上+2。因?yàn)閐p[i-2]代表了以i-2元素為結(jié)尾的有效字串最長(zhǎng)長(zhǎng)度。比如判斷index=7,index=6位置是左括號(hào),可以配對(duì),但要看dp[5]位置的數(shù)字,目前是0,為什么是0,因?yàn)閕ndex=5的位置是左括號(hào),不可能包含它結(jié)尾的有效字串。
而判斷index=8時(shí),index=7位置是右括號(hào),而dp[7]的值恰好指明了包含它的有效字串最長(zhǎng)度,所以讓i直接減去dp[7]的值,跳轉(zhuǎn)到“以index=7為結(jié)尾的最長(zhǎng)有效字串的更前面”,去看看有沒(méi)有和index=8配對(duì)的左括號(hào)。
如果有,則是三部分相加:本次的配對(duì)長(zhǎng)度(2)+ 前面臨接的有效長(zhǎng)度 + 本次配對(duì)左括號(hào)更前面的臨接的有效長(zhǎng)度。
很可能因?yàn)楸敬蔚呐鋵?duì),導(dǎo)致兩個(gè)有效長(zhǎng)度合并起來(lái),行程更大的長(zhǎng)度,比如:
作者:zhangkekf
鏈接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/dong-tai-gui-hua-c-by-zhangkekf/
來(lái)源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的动态规划是真的难啊坚持的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java dump分析工具_Java虚拟
- 下一篇: 有人知道csdn在国外登不上的原因吗