这道题,我一开始的想法是,递归,但是涉及到排列组合的时候,觉得怎么也想不出一个很好的办法。即使是有了答案的公式之后,想要直接排列组合得到结果还是不容易。
后来看了答案,答案给出公式
f(i) = f(i+1) + g(i,i+1)*f(i+2),其中f(i)表示以数字i为开头的种类个数,g表示,若i和i+1可以组合成小于26的数,则为1,否则为0.这样的递归,是可以计算出所有的情况的,但是会有重复子问题。因此,从右向左翻译并计算不同翻译的数目,自下而上解决问题。
在从下往上的时候,先计算最后一个,因为之前的计算要依靠靠后元素的计算结果,因此一个保存结果的数组就可以实现从下往上
答案代码
public int translateNum(int num) {
String num_s = num + "";
char[] num_c = num_s.toCharArray();
int[] time_num = new int[num_c.length];
for(int count = num_c.length -1;count>=0;count--){
if(count == num_c.length -1){
time_num[count] = 1;
}else{
time_num[count] = time_num[count+1];
}
if(count + 1 <num_c.length){
int dig1 = num_c[count] - '0';
int dig2 = num_c[count+1] - '0';
if(dig1*10 + dig2 <=25 && dig1*10 + dig2 >= 10){
if(count < num_c.length - 2){
time_num[count] += time_num[count + 2];
}else{
time_num[count] += 1;
}
}
}
}
return time_num[0];
}