把数字翻译成字符串,剑46
1. 描述
- 给定一个数字,按照如下规则把它翻译为字符串:
- 0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。
- 一个数字可能有多个翻译。计算一个数字有多少种不同的翻译方法。
输入:s = 12258
输出:5
种类:["bccfi","bwfi","bczi","mcfi","mzi"]
2. 方法(动态规划)
- 标准动态规划求解,其中
table[n]
表示n个位数的翻译方法总数。关键在于i - 2
与i - 1
位拼接的数与25
的大小关系。同时注意i - 2
位数不能为0
,例如06
只有一种翻译方法。
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int len = s.length();
int[] table = new int[len + 1];
table[0] = 1;
table[1] = 1;
for (int i = 2; i <= len; i++) {
int num1 = s.charAt(i - 2) - '0';
int num2 = s.charAt(i - 1) - '0';
if ((num1 == 0) || (num1 * 10 + num2 > 25)) {
table[i] = table[i - 1];
} else {
table[i] = table[i - 1] + table[i - 2];
}
}
return table[len];
}
}
- 优化:由于
table[n]
最多只与前2个状态有关,所以可以使用两个变量来存储状态。
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int len = s.length();
int dp1 = 1;
int dp2 = 1;
int res = 1;
for (int i = 2; i <= len; i++) {
int num1 = s.charAt(i - 2) - '0';
int num2 = s.charAt(i - 1) - '0';
if ((num1 == 0) || (num1 * 10 + num2 > 25)) {
res = dp2;
} else {
res = dp1 + dp2;
}
dp1 = dp2;
dp2 = res;
}
return res;
}
}