一條包含字母 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) 。
本次從尾開始遍歷至頭是較好的選擇
如果開頭為0 ,則無法編碼 dp【i】=0;
對226 進行分析
dp 的情況 nums!= 0 所以 dp[2]=1 dp[1] 26 因為 nums*10 + nums=26 不大於 26 所以 dp= 2 ;
dp226 nums[0]*10+nums[1]=22<26 所以dp=dp[1]+dp =3
如果 為 426 nums*10+nums=42 》26 , dp[0]=dp[1]=2; 即 4 ,26 與 4,2,6
所以轉移方程出現 *if(nums[i]10+nums[i+1]<=10) dp [i]=dp[i+1]+dp[i+2] else dp[i]=dp[i+1]
從原理上講 定義開始的數字為 i 若 nums[i]*10+nums[i+1]大於了26 ,說明他們一定要分開放 那麼對於 以i開頭的組合其實是與i+1 開頭組合的個數一樣的
若 nums[i]*10+nums[i+1] <26 那麼可以吧 i 與 i+1 去掉 看以i+2 開頭的組合個數 加上 吧i視為個體,以i+1 為開頭的組合
同時注意 開頭數字為0的組合情況為 0
class solution
dp[len]=1;
//檢測末尾是否為0
if(s.charat(len-1)=='0')
else
for(int i=len-2;i>=0;i--)
if ((s.charat(i) - '0') * 10 + (s.charat(i + 1) - '0') <= 26)
else
}return dp[0];
}}
91 解碼方法
方法一 動態規劃法 該問題可以通過動態規劃的方法進行求解,我們假設s i 代表一條長度為i的訊息,對應的解碼方法的總數為dp i 那麼這個值的大小和dp i 1 以及dp i 2 相關,因為解碼時只有一位或者兩位字元可以作為乙個原碼看待。當我們假設這條訊息的最後一位作為原碼時,它的取值範圍為 1 9...
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 或者 b...
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 或者 bb...