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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

639. 解码方法 II

發(fā)布時間:2023/11/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 639. 解码方法 II 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

639. 解碼方法 II

一條包含字母 A-Z 的消息通過以下的方式進行了編碼:

'A' -> 1 'B' -> 2 ... 'Z' -> 26

要 解碼 一條已編碼的消息,所有的數(shù)字都必須分組,然后按原來的編碼方案反向映射回字母(可能存在多種方式)。例如,“11106” 可以映射為:

“AAJF” 對應(yīng)分組 (1 1 10 6)
“KJF” 對應(yīng)分組 (11 10 6)
注意,像 (1 11 06) 這樣的分組是無效的,因為 “06” 不可以映射為 ‘F’ ,因為 “6” 與 “06” 不同。

除了 上面描述的數(shù)字字母映射方案,編碼消息中可能包含 '’ 字符,可以表示從 ‘1’ 到 ‘9’ 的任一數(shù)字(不包括 ‘0’)。例如,編碼字符串 "1" 可以表示 “11”、“12”、“13”、“14”、“15”、“16”、“17”、“18” 或 “19” 中的任意一條消息。對 “1*” 進行解碼,相當(dāng)于解碼該字符串可以表示的任何編碼消息。

給你一個字符串 s ,由數(shù)字和 ‘*’ 字符組成,返回 解碼 該字符串的方法 數(shù)目 。

由于答案數(shù)目可能非常大,返回對 109 + 7 取余 的結(jié)果。

示例 1:輸入:s = "*" 輸出:9 解釋:這一條編碼消息可以表示 "1"、"2"、"3"、"4"、"5"、"6"、"7"、"8" 或 "9" 中的任意一條。 可以分別解碼成字符串 "A"、"B"、"C"、"D"、"E"、"F"、"G"、"H" 和 "I" 。 因此,"*" 總共有 9 種解碼方法。 示例 2:輸入:s = "1*" 輸出:18 解釋:這一條編碼消息可以表示 "11"、"12"、"13"、"14"、"15"、"16"、"17"、"18" 或 "19" 中的任意一條。 每種消息都可以由 2 種方法解碼(例如,"11" 可以解碼成 "AA" 或 "K")。 因此,"1*" 共有 9 * 2 = 18 種解碼方法。 示例 3:輸入:s = "2*" 輸出:15 解釋:這一條編碼消息可以表示 "21"、"22"、"23"、"24"、"25"、"26"、"27"、"28" 或 "29" 中的任意一條。 "21"、"22"、"23"、"24"、"25" 和 "26" 由 2 種解碼方法,但 "27"、"28" 和 "29" 僅有 1 種解碼方法。 因此,"2*" 共有 (6 * 2) + (3 * 1) = 12 + 3 = 15 種解碼方法。

數(shù)組含義

dp[i]代表字符串前i個字符的解碼方法數(shù)目

初始化

dp[0]=1。代表空字符串的解碼方法只有一種

狀態(tài)轉(zhuǎn)移

  • 當(dāng)只解碼一個字符時,將當(dāng)前字符可能的情況數(shù)目與前面的dp[i-1]相乘
    • 字符為*,可以解碼為1-9,共9種情況
    • 字符不為*,解法已經(jīng)確定了,只能有一種解碼方法
  • 解碼兩個字符時,,將當(dāng)前字符可能的情況數(shù)目與前面的dp[i-2]相乘
    • 字符為**,能解碼出11-19 21-26共15種
    • 字符為*c,*只能解碼為1或者2,當(dāng)c小于6時,可以為1或者2(2種),否則只能解碼為1(1種)
    • 字符為c*,c只能為1或者2才能進行解碼,1可能匹配9種情況,2能匹配6種情況
    • 字符為cc,要判斷cc是否處于10-26這個區(qū)間(1種情況),否則0種

    代碼

    class Solution {public int numDecodings(String s) {int n=s.length(),mod=1000000007;long[] dp=new long[n+1];dp[0]=1;for(int i=0;i<n;i++){dp[i+1]=dp[i]*getOne(s.charAt(i))%mod;if(i>0){dp[i+1]=(dp[i+1]+(dp[i-1]*getTwo(s.charAt(i-1),s.charAt(i))))%mod; }}return (int)dp[n];}public int getOne(char c){if(c=='0') return 0;return c=='*'?9:1;}public int getTwo(char c1,char c2){if(c1=='*'&&c2=='*')return 15;if(c1=='*')return c2>'6'?1:2;if(c2=='*'){if(c1=='2')return 6;else if(c1=='1')return 9;else return 0;}if(c1=='1'||c1=='2'&&c2<='6')return 1;return 0; } }

    總結(jié)

    以上是生活随笔為你收集整理的639. 解码方法 II的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。