一條包含字母a-z
的訊息通過以下方式進行了編碼:
'a' -> 1
'b' -> 2
...'z' -> 26
給定乙個只包含數字的非空字串,請計算解碼方法的總數。
示例 1:
輸入: "12"
輸出: 2
解釋: 它可以解碼為 "ab"(1 2)或者 "l"(12)。
示例 2:
輸入: "226"
輸出: 3
解釋: 它可以解碼為 "bz" (2 26), "vf" (22 6), 或者 "bbf" (2 2 6) 。
動規首先就是要分解子問題嘛
首先捏,從巨集觀上來看,先不管各種限制,進行如下分析:
字串長度為1時,假設字串是「1」,f(1)= 1;
字串長度為2時,假設字串是「12」,f(2)= 2;情況有:(1,2)(12)
字串長度為3時,假設字串是「123」,f(3)= f(2) + f(1);
為什麼是這樣呢?
情況一:「3」 和 「12」的情況,「12」的種類正是f(2)
情況二:「23」 與 「1」的情況,「1」的種類正是f(1)
有些人就奇怪,為什麼不算」23「的種類,來看一下」23「可以分成(2,3)和(23),但是」2,3「這種情況在情況一中已有體現(情況一已把3單獨拆開),情況二這裡再算的話就會有重複。
以此類推,f(n) = f(n - 1) + f(n -2 );
接下來看到細節:
分析情況一:解碼方法數為:最後乙個數字提取出來,這個數字之前的字串的解碼方法數。
提取數字前的字串解碼方法數f(n - 1)不多bb,分析一下提取出來的數字。
根據題意可知(1~26)表示a~z,其中單個數字範圍就是1~9了
所以可知提取出來的數字是0時,情況一為0,否則才是f(n - 1);
分析情況二:解碼方法數為:最後兩個數字提取出來,這倆數字之前的字串的解碼方法數。
提取數字前的字串解碼方法數f(n - 2)不多bb,分析一下提取出來的倆數字。
根據題意可知(1~26)表示a~z,其中單個數字範圍就是10~27了
所以大於27或小於10情況二直接為0,否則是f(n - 2);
**如下:
public int numdecodings(string s)
return ints[ints.length - 1];
}
LeetCode91 解碼方法
這題,我花了好大的功夫才通過,中途踩了很多坑,從這個15頂25踩,通過率只有10 多,就能看出這個題,雖然是乙個中等難度的題,但是並沒有那麼好做。看到題目,感覺有點像爬樓梯的那個?想到用動態規劃。第一次寫 沒有考慮0的情況,出錯,那麼就考慮吧,如果出現在頭,就返回0,出現的中間的話。不過我是從後往前...
leetcode 91 解碼方法
一條包含字母a z的訊息通過以下方式進行了編碼 a 1 b 2 z 26給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3解釋 它可以解碼為 bz 2 26 vf 22 6 或者 bbf...
LeetCode 91 解碼方法
一條包含字母 a z 的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3 解釋 它可以解碼為 bz 2 26 vf 22 6 或...