leetcode_91. Decode Ways

A message containing letters from A-Z is being encoded to numbers using the following mapping:

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

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

给定一串数字,求这串数字能表达几种不同的字母排列。

又是在讨论区淘来的一份答案(@_@;),鉴于发帖人没有给出注释和说明,我自己理解了一下分享出来

思路

假设: i-1 位数字可以组成 count( i-1 ) 种排列,i-2 位数字可以组成 count( i-2 )种排列。求:在此基础上加一位,组成 i 位数字,可以组成多少种排列?

情况1:第 i 位数和第 i-1 位数不能组成 <= 26的数字,那么后 i-1 位能组成多少种排列,这 i 位数字就可以组成多少种,相当于每种排列的首部加个第 i 位数所能代表的数字,排列种数不变。即有 count( i ) = count( i-1)。例如:数字字符312,后 2 位是 12,12 可以组成 2 种排列,分别是AB(1,2)和L(12),因为31 > 26,所以 312 可以组成 2 种排列,分别是 CAB(3,1,2)和 CL(3,12)。

情况2:第 i 位数和第 i-1 位数能组成 <= 26的数字,这时排列种数= (i 和 i-1 组合时,剩下的 i-2 位能组成的种数) + ( i 不和 i-1 组合,即情况1),即 count(i) = count (i-2) + count(i-1)。因为前两位组合时,有多少种完全取绝于后 i-2 位的排列。例如:数字字符1312, 后3位312可以组成2种排列组合, 后2位有2种排列组合,13<=26成立,当13组合时,求1312相当于求12,分别是( 13, 12 ) 和 (13, 1, 2),两种;当13不组合时,求1312相当于求312,分别是(1, 3 , 12)和(1, 3, 1, 2),两种。所以1312共有4种组合,( 13, 12 )  (13, 1, 2) (1, 3 , 12) (1, 3, 1, 2)。

讲了一堆也不知道有没有讲清楚…附上代码,有什么问题欢迎留言交流-O-

class Solution {
    public int numDecodings(String s) {
        int len = s.length();
        if (len == 0)
            return 0;
        int[] count = new int[len + 1];
        count[len] = 1;
        count[len - 1] = s.charAt(len - 1) == '0'? 0: 1;
        for (int i = len - 2; i >= 0; i--){
            if (s.charAt(i) == '0')
                continue;
            count[i] = (Integer.parseInt(s.substring(i, i + 2)) <= 26 )?count[i+1] + count [i+2]: count[i+1];
        }
        return count[0];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值