639. 解码方法 II
生活随笔
收集整理的這篇文章主要介紹了
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)移
- 字符為*,可以解碼為1-9,共9種情況
- 字符不為*,解法已經(jīng)確定了,只能有一種解碼方法
- 字符為**,能解碼出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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到落水了是什么意思
- 下一篇: 517. 超级洗衣机