【剑指offer】46. 把数字翻译成字符串

解题思路

第一步:定义数组元素的含义

题目要求的是一个数字有多少种不同的翻译方法,因此设dp[i]代表第i个结尾的数字的翻译方案数量

第二步:找出关系数组元素间的关系式

x i x_{i} xi x i − 1 x_{i-1} xi1组成的数字可以被翻译,
dp[i]=dp[i-1]+dp[i-2], x i − 1 x i ϵ [ 10 , 25 ] x_{i-1}x_{i}\epsilon [10,25] xi1xiϵ[10,25];
否则dp[i]=dp[i-1], x i − 1 x i ϵ [ 1 , 10 ) ∪ ( 25 , 99 ] x_{i-1}x_{i}\epsilon [1,10)\cup\left ( 25,99 \right ] xi1xiϵ[1,10)(25,99]

第三步:初始状态

dp[0]=dp[1]=1 ,即“无数字”和“第1位数字”的翻译方法数量均为1

第四步:返回值

dp[n],即此数字的翻译方案数量

代码1——字符串遍历

利用迭代方式编写

class Solution {
public:
    int translateNum(int num) {
        std::string ans = std::to_string(num);
        if (ans.size() < 2) return 1;//特判
        std::vector<int> dp(ans.size() + 1);
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= ans.size(); i++) {
            std::string temp = ans.substr(i - 2, 2);
            if (temp < "10" || temp>"25") dp[i] = dp[i - 1];//不可以翻译
            else dp[i] = dp[i - 1] + dp[i - 2];//可以翻译
        }
        return dp[ans.size()];
    }
};
代码2——数字求余

利用递归方式编写

class Solution {
public:
    int translateNum(int num) {
        return f(num);
    }
    int f(int num) {
        if (num < 10) return 1;
        if (num % 100 < 10 || num % 100 > 25) {
            return f(num / 10);//不可以翻译
        }
        else {
            return f(num / 10) + f(num / 100);//可以翻译
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值