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];
}
}