动态规划是真的难啊坚持
動態規劃的思路,和官方題解的思路是一樣的。在這里我說說我的思考過程。
一開始我沒有直接想到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)+ 前面臨接的有效長度 + 本次配對左括號更前面的臨接的有效長度。
很可能因為本次的配對,導致兩個有效長度合并起來,行程更大的長度,比如:
作者:zhangkekf
鏈接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/dong-tai-gui-hua-c-by-zhangkekf/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的动态规划是真的难啊坚持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java dump分析工具_Java虚拟
- 下一篇: phpcms ajax 调取文章内容,P