题目:给定一个数字,我们按照如下规则把它翻译为字符串;0翻译成“a”,1翻译成“b”,…
11翻译成“l”,…,25翻译成“z”.一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi” “bwfi” “bczi” “mcfi” “mzi” 请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
思路:递归从最大的问题开始自上而下解决问题,我们也可以从最小的子问题开始自下而上解决问题,这样就可以消除重复的子问题,也就是说,我们从数字的末尾开始,然后从右到左翻译并计算不同翻译的数目。下面是参考代码:
package cn.yu.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println(getTranslationCount(12258));
}
static int getTranslationCount(int number) {
if(number<0) return 0;
String numberString = String.valueOf(number);
return getTranslationCount(numberString);
}
private static int getTranslationCount(String s) {
int length = s.length();
int [] counts = new int[length];
int count = 0;
for(int i = length-1;i>=0;i--) {
count = 0;
if(i<length-1) {
count = counts[i+1];
}else count =1;
if(i<length-1) {
int digit1 = s.charAt(i) - '0';
int digit2 = s.charAt(i+1) - '0';
int converted = digit1*10+digit2;
if(converted>=10 && converted<=25) {
if(i<length-2) {
count+=counts[i+2];
}else count+=1;
}
}
counts[i] = count;
}
count = counts[0];
return count;
}
}
运行结果:5