//A message containing letters from A-Z can be encoded into numbers using the fo
//llowing mapping:
//
//
//'A' -> "1"
//'B' -> "2"
//...
//'Z' -> "26"
//
//
// To decode an encoded message, all the digits must be grouped then mapped back
// into letters using the reverse of the mapping above (there may be multiple ways
//). For example, "11106" can be mapped into:
//
//
// "AAJF" with the grouping (1 1 10 6)
// "KJF" with the grouping (11 10 6)
//
//
// Note that the grouping (1 11 06) is invalid because "06" cannot be mapped int
//o 'F' since "6" is different from "06".
//
// Given a string s containing only digits, return the number of ways to decode
//it.
//
// The test cases are generated so that the answer fits in a 32-bit integer.
//
//
// Example 1:
//
//
//Input: s = "12"
//Output: 2
//Explanation: "12" could be decoded as "AB" (1 2) or "L" (12).
//
//
// Example 2:
//
//
//Input: s = "226"
//Output: 3
//Explanation: "226" could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2
// 6).
//
//
// Example 3:
//
//
//Input: s = "06"
//Output: 0
//Explanation: "06" cannot be mapped to "F" because of the leading zero ("6" is
//different from "06").
//
//
//
// Constraints:
//
//
// 1 <= s.length <= 100
// s contains only digits and may contain leading zero(s).
//
// Related Topics String Dynamic Programming
// 👍 7632 👎 3950
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int numDecodings(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int[] f = new int[s.length() + 1];
if (s.charAt(0) == '0') {
return 0;
}
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= s.length(); i++) {
int last = s.charAt(i - 2) - '0';
int cur = s.charAt(i - 1) - '0';
if (cur > 0) {
f[i] += f[i - 1];
}
if (last != 0 && (last * 10 + cur <= 26)) {
f[i] += f[i - 2];
}
if (f[i] == 0) {
return 0;
}
}
return f[s.length()];
}
}
//leetcode submit region end(Prohibit modification and deletion)