题目描述
// 46. 把数字翻译成字符串
// 力扣
// 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,
// 1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可
// 能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同
// 的翻译方法。
题解
/// 动态规划
// 力扣
// 执行用时: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(); // 取s长度
// 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; i <= len; i++) {
// 结合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]; // 最后返回dp结果,后一状态取决于前一状态,尾
// 元素即为最终状态
}
}
// 力扣
// 简略写法
// 执行用时: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; i <= len; i++) {
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];
}
}