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) 。

解题思路:感觉不太好描述,直接看代码吧。。。。。

Java代码:

public int numDecodings(String s) {
    int len = s.length();
    int[] decodecCnt = new int[len];
    for(int i = 0; i < len; i++){

        if(0 == i){
            //第一位,return 0
            if('0' == s.charAt(i))
                return 0;
            decodecCnt[i] = 1;
            continue;
        }

        //当前位为0,但是前一位大于2或者为0,即当前位的0无法组成10/20的情况,无法解码,return 0
        if('0' == s.charAt(i) && ('2' < s.charAt(i-1) || '0' == s.charAt(i-1)))
            return 0;

        if(1 == i){
            decodecCnt[i] = '0' == s.charAt(i) ? 1 :
                    (('1' == s.charAt(i-1) || ('2' == s.charAt(i-1) && '6' >= s.charAt(i))) ? 2 : 1);
            continue;
        }

        /**
         * 若当前位为0,则必须与前一位组成为10/20解码,decodecCnt[i] = decodecCnt[i-2]
         * 否则,若前一位为0,则当前位只能单独解码,decodecCnt[i] = decodecCnt[i-1]
         * 否则,判断当前位和前一位是否小于等于26,若不满足,即当前位只能单独解码,decodecCnt[i] = decodecCnt[i-1]
         * 若满足,即当前既可单独解码,又可与前一位组合解码,decodecCnt[i] = decodecCnt[i-2] + decodecCnt[i-1]
         *
         * */
        decodecCnt[i] = '0' == s.charAt(i) ? decodecCnt[i-2] : ('0' == s.charAt(i-1) ? decodecCnt[i-1] :
                (('1' == s.charAt(i-1) || ('2' == s.charAt(i-1) && '6' >= s.charAt(i))) ?
                        decodecCnt[i-2] + decodecCnt[i-1] : decodecCnt[i-1]));
    }

    return decodecCnt[len-1];
}

猜你喜欢

转载自blog.csdn.net/weixin_38823568/article/details/82845099