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).
Solutions
classSolution {public:intnumDecodings(string s) { vector<int>n(s.size() +1,0);if (s[0] =='0')return0; // s[0:i]: first i elements in s (not including s[i]) // n[i]: number of ways to decode s[0:i]n[0] =n[1] =1;for (int i =1; i <s.size(); ++i) {if (s[i] =='0') {if (s[i -1] =='1'||s[i -1] =='2') {n[i +1] =n[i -1]; } else {return0; } } elseif (s[i] <'7') {if (s[i -1] =='1'||s[i -1] =='2') {n[i +1] =n[i] +n[i -1]; } else {n[i +1] =n[i]; } } else {if (s[i -1] =='1') {n[i +1] =n[i] +n[i -1]; } else {n[i +1] =n[i]; } } }returnn[s.size()]; }};
More concise solution
classSolution {public:intnumDecodings(string s) {if (s[0] =='0')return0; vector<int>dp(s.size() +1);dp[0] =dp[1] =1;for (int i =1; i <s.size(); ++i) { // temp: number of ways to decode s[0:i+1] // such that s[i] is alone.int temp =s[i] =='0'?dp[i] :0;if (s[i -1] =='1'||s[i -1] =='2'&&s[i] <'7') { // possible to group s[i-1] and s[i]dp[i +1] = temp +dp[i -1]; } else { // not possible to group s[i-1] and s[i]dp[i +1] = temp; } }returndp[s.size()]; }};