summary:
dynamic program
package myapp.kit.leetcode.top145;
import java.util.HashMap;
import java.util.Map;
/**
*
* 91
* medium
*https://leetcode.com/problems/decode-ways/
*
* 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).
*
*
* @author huangdingsheng
* @version 1.0, 2020/6/11
*/
public class DecodeWays {
static Map<String, Integer> cache;
public static int numDecodings(String s) {
cache = new HashMap<>();
return process(s);
}
// approach1 : memorization , dynamic program top-down
private static int process(String s) {
if (cache.containsKey(s)) {
return cache.get(s);
}
int res = 0;
if (s.length() == 0 || s.charAt(0) == '0') {
res = 0;
} else if (s.length() == 1) {
if (Integer.parseInt(s) != 0) {
res = 1;
} else {
res = 0;
}
} else if (s.length() == 2) {
if (Integer.parseInt(s) <= 26) {
if (Integer.parseInt(s.substring(1, 2)) != 0) {
res = 2;
} else {
res = 1;
}
} else {
if (s.charAt(1) != '0') {
res = 1;
} else {
res = 0;
}
}
} else {
int temp = Integer.parseInt(s.substring(0, 2));
if (temp <= 26) {
if (temp == 10 || temp == 20) {
res = process(s.substring(2));
} else {
res = process(s.substring(1)) + process(s.substring(2));
}
} else {
res = process(s.substring(1));
}
}
cache.put(s, res);
return res;
}
// approach2 : dynamic program bottom-up
public static int numDecodings2(String s) {
if (s.charAt(0) == '0') {
return 0;
}
int[] dp = new int[s.length() + 1];
dp[0] = 0;
dp[1] = 1;
if (s.length() == 1) {
return dp[1];
}
int value = Integer.parseInt(s.substring(0, 2));
if (value > 26) {
if (s.charAt(1) == '0') {
dp[2] = 0;
} else {
dp[2] = 1;
}
} else {
if (s.charAt(1) == '0') {
dp[2] = 1;
} else {
dp[2] = 2;
}
}
for (int i = 3; i <= s.length(); i++) {
int temp = Integer.parseInt(s.substring(i - 2, i));
if (temp > 26) {
if (s.charAt(i - 1) != '0') {
dp[i] = dp[i - 1];
} else {
dp[i] = 0;
}
} else {
if (s.charAt(i - 1) == '0') {
if (s.charAt(i - 2) == '0') {
dp[i] = 0;
} else {
dp[i] = dp[i - 2];
}
} else {
if (s.charAt(i - 2) == '0') {
dp[i] = dp[i - 1];
} else {
dp[i] = dp[i - 1] + dp[i - 2];
}
}
}
}
return dp[s.length()];
}
public static void main(String[] args) {
System.out.println(numDecodings2("226"));
}
}