剑指 Offer 46把数字翻译成字符串(递归、动态规划)

1、题目描述

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

提示:

0 <= num < 231

2、示例

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

3、题解

动态规划。

本题类比爬楼梯,dp[n] = dp[n-1]+dp[n-2]

dp[n]代表走到最后一个字符,能有多少多少种翻译方法

对于访问到当前的字符dp[n],能有多少种翻译?

1.当前字符翻译为1个字符这是一种方法,dp[n] = dp[n-1]

2.当前字符和前一个字符共同翻译为一种方法 dp[n]+=dp[n-2],此时的条件为前后两个字符可以翻译为同一个字符。

3.还有 04,05,06,这种只能翻译为1种,其组合不能作为一种翻译。

class Solution {
public:
    int translateNum(int num) {
        string s = to_string(num);
        int n = s.size();
        vector<int> f(n + 1);
        f[0] = 1;
        for (int i = 1; i <= n; i ++ ) {
            f[i] = f[i - 1];
            if (i > 1) {
                int t = s[i - 1] - '0' + (s[i - 2] - '0') * 10;
                if (t >= 10 && t <= 25) f[i] += f[i - 2];
            }
        }
        return f[n];
    }
};
class Solution {
public:
    int res=0;
    int translateNum(int num) {
        string s=to_string(num);
        Recursion(s,0);
        return res;
    }
    void Recursion(string s,int i)
    {
        if(i==s.size())
        {
            res++;
            return;
        }
        Recursion(s,i+1);
        if(i+1<s.size()&&(s[i]=='1'||(s[i]=='2'&&s[i+1]<='5')))
            Recursion(s,i+2);
        return;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值