'A' -> 1
'B' -> 2
...
'Z' -> 26
Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
// Dynamic Programming
int numDecodings(string s) { // time: O(n); space: O(n)
if (s.empty() || s[0] == '0') return 0;
int n = s.size();
vector<int> dp(n + 1, 0); // dp[i]: # of decode ways of s[0...i-1]
dp[0] = dp[1] = 1;
for (int i = 2; i <= n; ++i) {
// 1 ~ 9
if (s[i - 1] >= '1' && s[i - 1] <= '9')
dp[i] += dp[i - 1];
// 10 ~ 26
if (s[i - 2] == '1' || s[i - 2] == '2' && s[i - 1] >= '0' && s[i - 1] <= '6')
dp[i] += dp[i - 2];
}
return dp.back();
}