LintCode刷題——解碼方法

題目描述:算法

有一個消息包含A-Z經過如下規則編碼數組

'A' -> 1
'B' -> 2
...
'Z' -> 26

如今給你一個加密事後的消息,問有幾種解碼的方式編碼

樣例:加密

給你的消息爲12,有兩種方式解碼 AB(12) 或者 L(12). 因此返回 2spa

算法分析:code

'A'到'Z' 26個字母最多2位最少1位且不爲0,所以存在多種解碼的可能性。創建一維數組DP[i]表示到當前第i位字符時所能解碼的方式,所以對於某一位i,若其不爲‘0’,則DP[i] += DP[i-1],若其能與i-1位構成的數字在1到26之間,則DP[i]+=DP[i-2]。所以動態規劃表達式爲:blog

    ①S[i]!=0:DP[i] = DP[i-1] + (S[i-1]=='1'||S[i-1]=='2'&&S[i]<='6')?DP[i-2]:0;字符串

    ②S[i]=0:DP[i] = (S[i-1]=='1'||S[i-1]=='2')?DP[i-1]:0;string

要注意的一點是在進行二位數判斷時直接用字符進行判斷便可,Integer.valueOf()反而會增長代碼量如對前一位是‘0’的處理等等;it

代碼:

public class Solution {
    /*
     * @param s: a string,  encoded message
     * @return: an integer, the number of ways decoding
     */
    public int numDecodings(String s) {
        // write your code here
        int length = s.length();
        //對首位0或空字符串進行處理
        if(length==0||s.charAt(0)=='0'){
            return 0;
        }
        int[] result = new int[length+1];
        result[0] = 1;
        result[1] = 1;
        for(int i=1;i<length;i++){
            //遇到0時的處理方式
            result[i+1]=s.charAt(i)=='0'?0:result[i];
            //判斷數字是否在範圍內
            if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6'){
                result[i+1]+=result[i-1];
            }
        }
        return result[length];
    }
}
相關文章
相關標籤/搜索