题目描述

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

1
2
3
输入: 12258
输出: 5
解释: 122585种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi""mzi"

提示:

  • 0 <= num < 2^31

解法

  • 动态规划

    • dp[i]表示为从0-i能翻译的种类数
    • 可以i单独作为一位来翻译,此时最后一位肯定是固定的只有一种,那么种类数在dp[i-1]就确定了
    • 如果第i−1位和第i位组成的数字在10到25之间,可以把这两位连起来翻译,同类种类数在dp[i-2]就固定了
    • 动态转移方程为:

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
26
class Solution {
public int translateNum(int num) {
String s=String.valueOf(num);
int len=s.length();
if (len<2){
return len;
}
char[] chars = s.toCharArray();
//定义dp[i]为从0-i能翻译的种类数
int[] dp=new int[len];
dp[0]=1;
for (int i = 1; i < len; i++) {
dp[i]=dp[i-1];
int curNum=10*(chars[i-1]-'0')+(chars[i]-'0');
if (curNum>9&&curNum<26){
if (i<2){
dp[i]++;
}else {
dp[i]+=dp[i-2];
}
}
}
return dp[len-1];

}
}
  • 时间复杂度:O(n)

来源:力扣(LeetCode)
链接:剑指 Offer 46. 把数字翻译成字符串 - 力扣(LeetCode)