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).
Example 2:
Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
解题思路
假如第 i 个编码的值在 1-9 之间,那么这一位可以独立编码,总编码可能个数 += 编码至第 i-1 位得到的可能的编码的个数;
假如第 i 个编码和第 i-1 个编码组合而成的两位数在 10-26 之间,那么这两位可以独立编码,总编码可能个数 += 编码至第 i-2 位得到的可能的编码的个数;
C++代码
class Solution {
public:
int numDecodings(string s) {
if(s.size() == 0)
return 0;
int sum[s.size()];
memset(sum, 0, sizeof(sum));
sum[0] = s[0] == '0'? 0 : 1;
if(s.size() == 1) {
return sum[0];
}
int k = s[0] > '0' && s[1] > '0'? 1:0;
sum[1] = k + (s[0] == '1' || (s[0] == '2' && s[1] <= '6')? 1 : 0);
for(int i = 2; i < s.size(); i++) {
if((int)(s[i]-48) > 0)
sum[i] += sum[i-1];
if(s[i-1] == '1' || s[i-1] == '2' && s[i] <= '6')
sum[i] += sum[i-2];
}
return sum[s.size()-1];
}
};