思路:
作者:xiao_ben_zhu
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/solution/shou-hui-tu-jie-dfsdi-gui-ji-yi-hua-di-gui-dong-ta/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int translateNum(int num) {
// 相当于加了条件的青蛙跳台阶问题
// 可以跳两步就是 [i-1] + [i-2] 相加
// 只能跳一步就是 [i-1],不能连跳那么翻译方式就不变
string nums = to_string(num); // C++11开始支持to_string
vector<int> dp(nums.size()+1);
// dp[i]代表前i位共多少,所以dp的数字开的比nums大一位
// 例如`12`,nums[i]的索引范围为0-1,而dp[i]为0-2,返回dp[2],即dp[nums.size()]
dp[0] = 1;
dp[1] = 1;
// dp[1]=1,是因为num>=0, 就算只有一位数也有一种翻译方式
// dp[0]=1,由dp[i+1] = dp[i] + dp[i-1]反推
// 例如`12` 共计2种翻译方式,dp[2] = dp[0]+dp[1] = 2
for(int i=1;i<nums.size();i++){
string temp = nums.substr(i-1,2); // 前一位加上现在的字符组成两位
if( temp>="10" && temp<="25")、,
dp[i+1] = dp[i] + dp[i-1];
else
dp[i+1] = dp[i];
}
return dp[nums.size()];
}
};