https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
思路:为了方便,我们把输入转换成一个字符串,并且下标从 1 1 1开始,用 d p [ i ] dp[i] dp[i]表示 s [ 1 … i ] s[1…i] s[1…i]对应的数字有多少种不同的翻译方法。显然单个数字一定可以对应一种翻译方法,所以有 d p [ i ] + = d p [ i − 1 ] dp[i]+=dp[i-1] dp[i]+=dp[i−1],如果是两个数字的话,我们需要计算然后判断它和 25 25 25的关系(注意特判掉前导 0 0 0的情况),如果也能对应一种翻译方法的话,就有 d p [ i ] + = d p [ i − 2 ] dp[i]+=dp[i-2] dp[i]+=dp[i−2]。注意初始化要使得 d p [ 0 ] = d p [ 1 ] = 1 dp[0]=dp[1]=1 dp[0]=dp[1]=1。
class Solution {
public:
int getval(int i,string &s)
{
if(s[i-1]=='0')//不合题意
return 30;
return (s[i-1]-'0')*10+s[i]-'0';
}
int translateNum(int num) {
stringstream ss;
ss<<" "<<num;
string s=ss.str();
vector<int> dp(s.size());
int len=s.size()-1;
dp[0]=dp[1]=1;//一个数字一定可以翻译成一个字符
for(int i=2;i<=len;i++)
{
dp[i]+=dp[i-1];//s[i]一个数字一定可以翻译成一个字符
if(getval(i,s)<=25)//s[i-1]和s[i]可以翻译成一个字符
dp[i]+=dp[i-2];
}
return dp[len];
}
};