59. 把数字翻译成字符串

问题1:状态表示  
f(i)表示前i位数字共有多少种不同的翻译方式

问题2:状态如何计算
如果第i位翻译成单独的字母,则方案数f(i)=f(i-1);
如果第i-1和i位翻译成单独的字母,则方案数f(i)=f(i-2);
f(i)=f(i-1)+f(i-2)
f(i-1)这种情况一定可以满足,因为第i位上的数字在0~9之间,是可以被翻译的;
但是(i-2)f(i-1)这种情况不一定有,因为
       1、i-1和i 构成的数字s[i-1]+s[i]不一定在0-25之间,
       2、不能出现05、06这种情况。不能以0开头。
       综上,10<=num[i-1]+num[i]<=25

问题3:边界
如果一个数字也没有,则
f(0)=1,答案就是f(n)

class Solution {
public:
    int getTranslationCount(string s) {
        int  n =s.size();
        vector<int> f(n+1);//动态规划的数组,因为数组是从0开始的。下标从1开始算。下标从1开始算,就不需要处理边界问题
        f[0] = 1;              //从1开始算,i-1其实是0,
        for(int i = 1;i<=n;i++)
        {
            f[i]=f[i-1];//f[i-1]到f[i]是无条件转移
            
            //t为i-1和i 构成的数字s[i-1]+s[i]的大小。
            //为什么要i减1和减2?因为我们的i是从1开始的
            int t= (s[i-2]-'0')*10+s[i-1]-'0';//把字符串变成数字要减去他的偏移量,偏移量就是'0'
            if(t>=10 && t<=25) //只有10=<t<=25,才能转移
                f[i]+=f[i-2];
            
        }
        return f[n];
    }
};

猜你喜欢

转载自www.cnblogs.com/make-big-money/p/12324213.html