91 解碼方法

2021-10-03 06:54:08 字數 1172 閱讀 5289

一條包含字母 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...