1. 程式人生 > >leetcode筆記91—編碼方法

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];
    }

}