A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
Dynamic programming: number of ways decoding message before position i is f [ i ]. If the number at i together with the number at i - 1 can be decoded to a valid letter, then f [ i ] = f [i - 1] + f [i - 2]. Else, f [ i ] = f [ i - 1]. Need to pay attention to 0 cases.
public class Solution {
public int numDecodings(String s) {
if (s == null || s.length() == 0 || s.charAt(0) == '0') {
return 0;
}
int[] num = new int[s.length()];
num[0] = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == '0') {
if (s.charAt(i - 1) - '0' < 1 || s.charAt(i - 1) - '0' > 2) {
return 0;
} else {
num[i] = (i == 1) ? 1 : num[i - 2];
}
} else {
if (s.charAt(i - 1) - '0' > 0 && (s.charAt(i - 1) - '0' == 1 ||
(s.charAt(i - 1) - '0' == 2 && s.charAt(i) - '0' <= 6))) {
num[i] = (i == 1) ? 2 : num[i - 1] + num[i - 2];
} else {
num[i] = num[i - 1];
}
}
}
return num[s.length() - 1];
}
}