[dp] LeetCode 91. Decode Ways
輸入:一個字符串,只包含0-9的字符。
輸出:解碼種類
規則:有一種信息映射規則 A->1,B->2…Z->26。
例如輸入’1’,只能解碼為A。
輸入’12’,可以解碼為’AB’,也可以是’L’,有2種解碼方式。
分析:這一個分析思路很自然,但是很麻煩,最后還是有邏輯漏洞(有漏洞是因為沒有把情況考慮全了)。
向這種多階段完成的題目已經做過很多,不假思索就是這樣想的。
如果需要解碼’12128’這個字符串,
如果只有1,一種解法:A
如果是12,可以看做1+2,也可以看做12。解碼就是A+B,或者L。
如果是121,可以看做是12+1,也可以看做是1+21。
如果是12+1,解法種類等于12的解法:2。
如果是1+21,解法種類等于1的解法:1。
最終結果是3。
如果是1212,可以看做是121+2,也可以看做是12+12。
如果是121+2,解法種類等于121的解法:3。
如果是12+12,解法種類等于12的解法:2。
最終結果是5。
如果是12127,可以看做是1212+7,也可以看做是121+27?錯了,27沒有對應的字母,所以只有1212+7這一種。
如果是1212+7,解法種類等于1212的解法:5。
看到這里其實動態轉移方程已經出來了。
對0字符還沒有考慮,0沒有對應的字母,那結果是怎樣的?
對于’012’,因為0沒有對應直接返回0。也就是0在首位,直接返回0。
對于’10’,可以分解為10+2兩個部分,解碼為’JB’,答案為1。
對于’210’,可以分解為2+10兩個部分,分解數量和’2’是一樣的,也就是dp[i] = dp[i-2]。
對于’280’,沒有分解策略,應該返回0。
對于’100’,分解為10+0不對,0沒有映射,分解為1+00,同樣不對,0還是沒有映射。應該直接返回0。
這道題目和爬樓梯是一個類型,只是有更多的限制條件。需要將各種情況思考一遍。參考鏈接。
public int numDecodings(String s) {if(s==null || s.length()==0 ) return 0;int n = s.length();int[] dp = new int[n];if(s.charAt(0)=='0') return 0;dp[0] = 1;if(n>1){if(s.charAt(1)=='0'){if(s.charAt(0)=='0'){return 0;}else if((s.charAt(0) - '0')*10 + (s.charAt(1) - '0')<=26){dp[1] = dp[0];}else{return 0;}}else{dp[1] = (s.charAt(0) - '0')*10 + (s.charAt(1) - '0')<=26?dp[0]+1:1;} }for(int i =2;i<n;i++){if(s.charAt(i)=='0'){if(s.charAt(i-1)!='0' && (s.charAt(i-1) - '0')*10 + (s.charAt(i) - '0')<=26){dp[i] = dp[i-2];}else {return 0;}}else{if(s.charAt(i-1)=='0'){dp[i] = dp[i-1];}else if( (s.charAt(i-1) - '0')*10 + (s.charAt(i) - '0')<=26){dp[i] = dp[i-1] +dp[i-2];}else{dp[i] = dp[i-1] ;}}}return dp[n-1];}分析2:從后往前看。參考鏈接。
例子依然是字符串’12128’
8:解法總數(8)=1
28:2+8,解法總數(28)=解法總數(8)
128:1+count(‘28’),或者12+8,解法總數(128)=解法總數(28)+解法 總數(8)
2128: 2+128;21+count(28),解法總數(2128)=解法總數(128)+解法 總數(28)
字符串’012’
2
12: 12 或者 1+2
012:0和誰都不能分到一起解碼,所以為0。
字符串 ‘100’
0:答案0
00 :答案 0
100:答案 0 因為前兩步都是0
字符串’1002’
當字符中包含0,對于當前位置不等于0的來說,number(i,i+1)<=26的話,解法總數(i)=解法總數(i+1)+解法總數(i+2),和上面的規則是相符 的。這樣來考慮就簡單了許多。
這樣從后向前考慮問題,以及對于0的處理,都是要學習的地方 。
總結
以上是生活随笔為你收集整理的[dp] LeetCode 91. Decode Ways的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux面试题,经典Linux面试题,
- 下一篇: Meteor创建示例项目 Simple-