递归&动态规划-解码方法
程序员文章站
2022-07-05 13:09:47
...
一条包含字母 A-Z 的消息通过以下方式进行了编码:
‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
递归
public int numDecodings(String s) {
int total = 0;
if (s.isEmpty()) {
return total;
}
String first = s.substring(0, 1);
if (0==Integer.valueOf(first)) {
return 0;
}
if (s.length() == 1) {
return 1;
}
int n = numDecodings(s.substring(1));
if (n>0) {
total += n;
}
first = s.substring(0, 2);
int x = Integer.valueOf(first);
if (x<=26) {
String y = s.substring(2);
if (y.isEmpty()) {
total += 1;
} else {
int t = numDecodings(y);
if (t>0) {
total += t;
}
}
}
return total;
}
动态规划
public int numDecodings(String s) {
if (s.isEmpty() || s.startsWith("0")) {
return 0;
}
int[] memo = new int[s.length()];
memo[0]=1;
if (s.length() > 1) {
Integer x = Integer.valueOf(s.substring(0,2));
if (s.charAt(1) == '0') {
if (x<27) {
memo[1] = 1;
} else {
memo[1] = 0;
}
} else {
if (x<27) {
memo[1] = 2;
} else {
memo[1] = 1;
}
}
}
for(int i=2;i<s.length();++i) {
String x = s.substring(i, i+1);
String y = s.substring(i-1, i+1);
if (x.equals("0")) {
if (y.equals("00")) {
memo[i]=0;
} else {
int k = Integer.valueOf(y);
if (k<27) {
memo[i] = memo[i-2];
} else {
memo[i]=0;
}
}
} else {
memo[i] = memo[i-1];
if(!y.startsWith("0")){
int k = Integer.valueOf(y);
if (k<27) {
memo[i] += memo[i-2];
}
}
}
}
return memo[s.length()-1];
}
推荐阅读
-
动态规划算法题:机器人到达指定合位置方法数
-
分析python动态规划的递归、非递归实现
-
120. 三角形最小路径和 (C语言+暴力递归+优化递归+动态规划+空间优化动态规划)
-
LeetCode 91. 解码方法(动态规划)
-
动态规划: 力扣91. 解码方法
-
LeetCode 91. 解码方法(动态规划)
-
LeetCode 91. 解码方法(动态规划) Java
-
【Hard 递归 动态规划 回文串15】LeetCode 730. Count Different Palindromic Subsequences
-
[每日一题] 116. 通配符匹配(字符串、动态规划、递归、多方法)
-
动态规划之矩阵连乘问题Python实现方法