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).
Companies:
Facebook, Google, Microsoft, Amazon, Salesforce, Uber, Yahoo
Related Topics:
String, Dynamic Programming
Similar Questions:
Denote dp[i]
as the result for substring S[0..i]
(i
∈ [0, N - 1]
).
For each letter S[i]
, we have two options:
- Use
S[i]
to decode.S[i]
shouldn't be'0'
. - Use
S[i - 1]
andS[i]
to decode.S[i - 1]
shouldn't be'0'
and the numberS[i - 1]
andS[i]
formed shouldn't be greater than 26.
When dp[i] == 0
, we should stop right away and return 0.
dp[i] = 0
dp[i] += dp[i - 1] if S[i] != '0'
dp[i] += dp[i - 2] if i != 0 && S[i - 1] != '0' && (S[i - 1] - '0') * 10 + S[i] - '0' <= 26
Since dp[i]
only depends on dp[i - 1]
and dp[i - 2]
. We can reduce the space to just two variables storing dp[i - 1]
and dp[i - 2]
.
// OJ: https://leetcode.com/problems/decode-ways
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
int numDecodings(string s) {
int pre2 = 0, pre1 = 1;
for (int i = 0; i < s.size() && pre1; ++i) {
int cur = 0;
if (s[i] != '0') cur += pre1;
if (i != 0 && s[i - 1] != '0' && (s[i - 1] - '0') * 10 + s[i] - '0' <= 26)
cur += pre2;
pre2 = pre1;
pre1 = cur;
}
return pre1;
}
};