题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258 有 5 种不同的翻译,分别是“bccfi”, “bwfi”, “bczi”, “mcfi”和“mzi”
提示:0 <= num < 231
题目链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
翻译规则
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | v | u | w | x | y | z |
解题思路
一、动态规划
首先把输入的数字转字符串 numStr,定义一个数组 dp[numStr.length],dp[i]表示子串 numStr[0, i+1]有多少种不同的翻译。因为子串 numStr[0, 1]只有一个字符,肯定只有一种翻译,所以初始化 dp[0] = 1,对于 i > 0 以后的子串 numStr[0, i+1],我们将子串 numStr[i-1, i+1]转换为数字 subInt,有以下两种情况:
- 当 10 <= subInt <= 25,说明 numStr[0, i+1]这个子串可以由 子串numStr[0, i]的翻译方式 + “x” 或者通过子串 numStr[0, i-1]的翻译方式 + “xx” 这两种形式来表示。所以 dp[i] = dp[i-1] + dp[i-2]。
- 当 subInt < 10 或者 subInt > 25 时,说明 numStr[0, i+1]这个子串只能通过 numStr[0, i]的翻译方式 + “x” 这种形式来表示,所以 dp[i] = dp[i-1]。
比如说 12258 这个数字,其对应的 dp 数组如下:
i | 0 | 1 | 2 | 3 | 4 |
numStr | 1 | 2 | 2 | 5 | 8 |
dp | 1 | 2 | 3 | 5 | 5 |
public int translateNum(int num) {
String numStr = Integer.toString(num);
int[] dp = new int[numStr.length()];
dp[0] = 1;
for (int i = 1; i < dp.length; i++) {
String sub = numStr.substring(i - 1, i + 1);
int subInt = Integer.parseInt(sub);
if (subInt <= 25 && subInt >= 10) {
if (i - 2 >= 0) {
dp[i] = dp[i - 1] + dp[i - 2];
} else {
dp[i] = dp[i - 1] + 1;
}
} else {
dp[i] = dp[i - 1];
}
}
return dp[dp.length - 1];
}
视频讲解
- 在 YouTube 上查看请点击https://youtu.be/RiwKtdWJvms
- 在 B 站上查看请点击https://www.bilibili.com/video/BV1HZ4y1H7md
- 在西瓜视频上查看请点击https://www.ixigua.com/i6837810836044513795