日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[dp] LeetCode 91. Decode Ways

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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。
看到這里其實動態轉移方程已經出來了。

當s[i] !=0 的時候: dp[i]=dp[i-1]+dp[i-2],這是當Number(i-1,i)<=26的時候。 dp[i]=dp[i-1] 這是當Number(i-1,i)>26的時候。

對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。

當s[i] ==0的時候: if Number(i-1,1)<=26,那么dp[i] = dp[i-2]if Number(i-1,1)>26,則返回0。 if 兩個連續的0挨著,則返回0。 if 0在第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的處理,都是要學習的地方 。

public int numDecodings(String s) {if(s==null || s.length()==0 ) return 0;int n = s.length();int[] dp = new int[n+1];dp[n] = 1;dp[n-1] = s.charAt(n-1)=='0'?0:1;for(int i=n-2;i>=0;i--){if(s.charAt(i)=='0'){dp[i] = 0;}else if((s.charAt(i)-'0')*10 + (s.charAt(i+1)-'0')<=26){dp[i] = dp[i+1]+dp[i+2];}else{dp[i] = dp[i+1];}}return dp[0];}

總結

以上是生活随笔為你收集整理的[dp] LeetCode 91. Decode Ways的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。