题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
这题具有对称性,即从左往右遍历和从右往左遍历得出的答案一致
代码实现
动态规划
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
if (s.length() < 2){
return s.length();
}
char[] chars = s.toCharArray();
//dp[i]代表到i位置,已经有多少种翻译方式
int[] dp = new int[chars.length];
dp[0] = 1;
int number = (chars[0]-'0')*10 + (chars[1]-'0');
System.out.println(number);
if (number > 25 || number < 10){
dp[1] = 1;
}else {
dp[1] = 2;
}
for (int i = 2; i < chars.length; i++) {
number = (chars[i-1]-'0')*10 + (chars[i]-'0');
//System.out.println(number);
if (number > 25 || number < 10){
dp[i] = dp[i-1] ;
}
else {
dp[i] = dp[i-1] + dp[i-2];
}
}
return dp[chars.length-1];
}
}
空间优化动态规划
K神代码
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int a = 1, b = 1;
for(int i = 2; i <= s.length(); i++) {
String tmp = s.substring(i - 2, i);
int c = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? a + b : a;
b = a;
a = c;
}
return a;
}
}
此题的动态规划计算是 对称的 ,即 从左向右 遍历(从第 dp[2] 计算至 dp[n] )和 从右向左 遍历(从第 dp[n - 2] 计算至 dp[0] )所得方案数一致。从右向左遍历的代码如下所示。
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int a = 1, b = 1;
for(int i = s.length() - 2; i > -1; i--) {
String tmp = s.substring(i, i + 2);
int c = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? a + b : a;
b = a;
a = c;
}
return a;
}
}
数字求余
class Solution {
public int translateNum(int num) {
int a = 1, b = 1, x, y = num % 10;
while(num != 0) {
num /= 10;
x = num % 10;
int tmp = 10 * x + y;
int c = (tmp >= 10 && tmp <= 25) ? a + b : a;
b = a;
a = c;
y = x;
}
return a;
}
}