题目: 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。一个数字有多少种不同的翻译方法。

此题是一个递归问题。递归式为:f(i)=f(i-1)+g(i)*f(i-2)。当最后两个数字在10到25之间g(i)才等于1。由于有重叠子问题,可以考虑用动态规划,自底向上求解。此题与青蛙跳台阶类似,难点在于判断g(i)哪时候等于1.

参考代码


/**
 * 把数字翻译成字符串,共有多少种翻译方案
 */
public class NumInString {
    public int getTranslationCount(int number){
        if (number<0)
            return 0;
        else
            return getTranslationCount(Integer.toString(number));
    }
    public int getTranslationCount(String number){
        char[] numberarray=number.toCharArray();
        int[] counts=new int[number.length()];//储存第i个数时,共有多少种翻译方案
        for (int i = 0; i <number.length() ; i++) {
            if (i==0)
                counts[i]=1;
            if (i==1)
            {
                counts[i]=1;
                int temp=numberarray[i]-'0'+(numberarray[i-1]-'0')*10;
                // 前两位也可以用一个字符表示
                if (temp>=10&&temp<=26){
                    counts[i]+=1;
                }
            }

                if (i>1){
                    counts[i]=counts[i-1];
                    int temp=numberarray[i]-'0'+(numberarray[i-1]-'0')*10;
                    // 前两位也可以用一个字符表示
                    if (temp>=10&&temp<=25){
                        counts[i]+=counts[i-2];
                    }
                }
            }
        return counts[number.length()-1];

    }
    public static void main(String[] args){
        int number=-1;
        NumInString numInString=new NumInString();
        System.out.println(numInString.getTranslationCount(number));
    }
}