题目描述

一条包含字母 A-Z 的消息通过以下方式进行了编码:
'a' -> 1
'b' -> 2
...
'z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

分析设计

这是LeetCode上的原题,很显然是动态规划的题目。
dp[i]表示到第i位时的编码总数
这需要考虑多种情况:
1、当s[i]=='0'时,如果s[i-1]=='1'或s[i-1]=='2',dp[i]=dp[i-2],否则直接返回0;
2、当s[i-1]=='1'时,如果s[i]>='1'且s[i]<='9',dp[i]=dp[i-1]+dp[i-2];
3、当s[i-1]=='2'时,如果s[i]>='1'且s[i]<='6',dp[i]=dp[i-1]+dp[i-2];
4、当然,以上1、2、3的情况是要i>=2的前提下,如果i==1,则第1种情况返回0;第2、3种情况dp[1]=1。

代码实现

class Solution{
    public int getCount(String s){
        int n = s.length();
        char[] ch = s.toCharArray();
        if(ch[0] == '0'){
            return 0;
        }
        int[] dp = new int[n];
        dp[0] = 1;
        for(int i = 1; i < n; ++i){
            if(i == 1){
                if(c[i] == '0'){
                    dp[i] = 1;
                }
                else if(c[i - 1] == '1' && c[i] >= '1' && c[i] <= '9'){
                    dp[i] = 2;
                }
                else if(c[i - 1] == '2' && c[i] >= '1' && c[i] <= '6'){
                    dp[i] = 2;
                }
                else{
                    dp[i] = 1;
                }
            }
            else{
                if(c[i] == '0' && (c[i - 1] == '0' || c[i - 1] >= '3')){
                    return 0;
                }
                else if(c[i] == '0'){
                    dp[i] = dp[i - 2];
                }
                else if(c[i - 1] == '1' && c[i] >= '1' && c[i] <= '9'){
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
                else if(c[i - 1] == '2' && c[i] >= '1' && c[i] <= '6'){
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
                else{
                    dp[i] = dp[i - 1];
                }
            }
        }
        return dp[n - 1];
    }
}