题目描述

给定一个数字,我们按照如下规则把它翻译为字符串:
0 翻译成 a,1 翻译成 b,……,11 翻译成 l,……,25 翻译成 z。
一个数字可能有多个翻译。
例如 12258 有 5 种不同的翻译,它们分别是 bccfi、bwfi、bczi、mcfi 和 mzi。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

思路:

动态规划,和跳台阶很像,每次只能跳一级或者两级台阶,总共多少种可能
这个是每两位数(10-25范围内)可以合并翻译,可以分开翻译,超出范围的只能分开翻译

f(i)=f(i−1)+f(i−2)   [i−1≥0,10≤x≤25]
f(i)=f(i−1)+f(i−2)   [else]

递归吧,从后往前遍历字符串,最底层的len为0或者1的情况,都只有一种翻译结果,都返回1

class Solution {
public:
    int translateNum(int num) {
        return Count(to_string(num));
    }
    int Count(string s) {
        int len=s.size();
        if(len==0||len==1) return 1;//len=0时返回1,因为len=2时,有两种可能 len(2)=len(1)+len(0)
        if("10"<=s.substr(len-2,2)&&s.substr(len-2,2)<="25")
        //这个范围的字符可以分成两个数字,可以合成一个数字
            return Count(s.substr(0,len-2))+Count(s.substr(0,len-1));
        else
            return Count(s.substr(0,len-1));
    }
};