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" (2 2 6) 。
思路:參考了網上大神的程式碼,原文連結如下: https://blog.csdn.net/u012156116/article/details/79763005。
這個題是給出一組數字,判斷共有多少種解碼方案。整體上可以看做是動態規劃。有些類似於上臺階有多少種解決方案。但這個題中有0和26的限制。以下程式碼的思路上先處理前兩個字元。第一個字元如果是0的話解碼方法就是0,;接著判斷第二個字元,這部分只需判斷第二個和第一個字元是否小於26.對於之後的各個字元,都有兩種形式的解碼方案,一是自己本身可以解碼,另外是和前一個字元組合。如果字元本身為0,需要判斷和前一個字元組合是否小於26,若滿足,則dp[i]=dp[1[+dp[i-2];若不是0,除了與前一個字元組合外,還可以自己編碼,即dp[i]=dp[i]+dp[i-1].
程式碼:
class Solution {
public static int numDecodings(String s) {
if(s.length()==0){
return 0;
}
int[] dp = new int[s.length()];
dp[0] = s.charAt(0)=='0'?0:1;
if(s.length()==1){
return dp[0];
}
int k = s.charAt(0) > '0' && s.charAt(1) > '0'? 1:0;
dp[1] = k + (s.charAt(0) == '1' || s.charAt(0) == '2' && s.charAt(1) <= '6' ? 1:0);
for (int i = 2; i < dp.length; i++) {
if(s.charAt(i)!='0'){
dp[i] += dp[i-1];
}
if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6'){
dp[i] += dp[i-2];
}
}
return dp[s.length()-1];
}
}