题目描述


题解
/////////////////////////////////// 动态规划 ////////////////////////
// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.2 MB, 在所有 Java 提交中击败了66.89%的用户
class Solution {
public int translateNum(int num) {
// num转为String类型用于遍历num中每个数字,记为s。
// 之后所有操作都基于s。
String s = Integer.toString(num)
if (s == null || s.length() == 0)
return 0
int len = s.length()
// dp数组,根据s[i-2]和s[i-1](实际没有s[i-2]和s[i-1])判断dp[i]
// 比如dp[2]表示s中前两个元素的组合数
int[] dp = new int[len + 1]
dp[0] = 1
dp[1] = 1
for (int i = 2
// 结合s[i-2]和s[i-1]的情况(记为temp),
// 用dp[i-2] dp[i-1]来判断dp[i]
String temp = s.substring(i - 2, i)
// 如果temp中数字大于10,小于25,说明可以组合
// dp[i]为dp[i - 2]和dp[i - 1]之和。
if (temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0)
dp[i] = dp[i - 2] + dp[i - 1]
else
dp[i] = dp[i - 1]
}
return dp[len]
// 元素即为最终状态
}
}
// 力扣
// 简略写法
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:34.9 MB, 在所有 Java 提交中击败了97.16%的用户
class Solution {
public int translateNum(int num) {
String s = Integer.toString(num)
if (s == null || s.length() == 0)
return 0
int len = s.length()
int[] dp = new int[len + 1]
dp[0] = 1
dp[1] = 1
for (int i = 2
String temp = s.substring(i - 2, i)
dp[i] = temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0 ? dp[i-2] + dp[i-1] : dp[i-1]
}
return dp[len]
}
}