【Java】解碼方法

題目描述

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

 具體解法就是動態規劃,看註釋吧,判斷情況都說明了

class Solution {
    public int numDecodings(String s) {
        //以0開頭的字符串,0是非法字符,只有在“10”,“20”這兩種情況下出現才合法,這裏直接0打頭,攤牌了,沒法玩了
        if(s.charAt(0)=='0') {
            return 0;
        }
        int[] dp=new int[s.length()];
        //單獨一個不是0的數字(1~9)必合法
        dp[0]=1;
        // 從第二個數字開始遍歷
        for(int i=1;i<s.length();i++){
            //當前數字爲‘0’
            if(s.charAt(i)=='0'){
                //連續兩個0,整個字符串非法,沒法解
                if(s.charAt(i-1)=='0') {
                    return 0;
                } else{
                    if(s.charAt(i-1)>'2') {
                        //0前頭不是1,也不是2,非法組合(既不能和前一個合併,也不能單獨拿出來)
                        return 0;
                    } else {
                        //“10”或者“20”的情況,只能把10,20綁定在一起解碼
                        // 判斷i-2是否存在
                        dp[i]=i-2 < 0 ?1:dp[i-2];
                    }
                }
                //當前數字不爲0
            }else{
                if(s.charAt(i-1)=='0') {
                    //如“1309”,指到9時,9不能和前面的0組合,0只能和1綁定在一起,所以還是1種解碼方法
                    dp[i]=dp[i-1];
                    //前面數字也不是0
                } else{
                    //判斷是否是1-26
                    if(Integer.parseInt(s.substring(i-1,i+1))<=26) {
                        dp[i]=(i-2)<0?2:(dp[i-1]+dp[i-2]);
                    } else {
                        //大於26的情況,只有1種解法,當前數字只能單獨拿出來
                        dp[i]=dp[i-1];
                    }
                }
            }
        }
        return dp[s.length()-1];
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章