递归这个思路就是分叉,到每一层都至少有一个分叉, 第二个分叉可能会大于25(题目是以0映射字符a),所以需要判断, 代码如下:
// static HashMap<Integer, Integer> map = new HashMap<>(); 这里是模仿记忆搜索也算是一种优化方式
private static int doTransfer(String s, int level) {
if (level == s.length()) {
return 1;
}
// int count = map.get(level) != null ? map.get(level) : 0;
// if (count != 0) {
// return count;
// }
count += doTransfer(s, level + 1);
if (level == s.length() - 1) {
return count;
}
int two = Integer.parseInt(s.substring(level, level + 2));
if (two < 26) {
count += doTransfer(s, level + 2);
}
// map.put(level, count);
return count;
}
根据递归代码可以看出 每一层能翻译的字符串的个数,只与他的后第一层,
以及后第二两层有关(最后一层除外它只能是1), 不过在和后第二层建立关系之前需要判断当前层和后一层的两个元素是否符合要求
所以代码如下:
private static int doTransfer(String s) {
if (s == null || s == "") return 0;
int len = s.length() + 1; // +1,是为了原数据的倒数第二位准备
int[] dp = new int[len];
dp[len - 1] = 0;
dp[len - 2] = 1;
for (int i = len - 3; i > -1; i--) {
dp[i] = dp[i + 1] + dp[i + 2] * canTranslate(s, i);
}
return dp[0];
}
private static int canTranslate(String s, int level) {
return Integer.parseInt(s.substring(level, level + 2)) < 26 ? 1 : 0;
}