day12:59. 把数字翻译成字符串(动态规划)

问题描述:
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。
一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例

  • 输入:“12258”
  • 输出:5

使用动态规划求解,首先明确三步 1)状态表示 2)状态计算 3)边界条件。在本题目中,使用 f(i) 来表示前 i 个字母可以构成的翻译方式个数。f(i)=f(i-1)+f(i-2) 这种情况是使用到两个字母的情况, 字母顺序从10到25的构成需要两个字母,因此需要判断使用两个字母的范围是在10~25之间才成立。 如果只使用一个字母那么f(i)=f(i-1)

class Solution {
public:
    int getTranslationCount(string s) {
        int n=s.size();
        vector<int> f(n+1);
        f[0]=1;
        for(int i=1;i<=n;i++)
        {
            f[i]=f[i-1];
            int t=10*(s[i-2]-'0')+(s[i-1]-'0');
            if(t>=10&&t<=25)  f[i]+=f[i-2];
        }
        return f[n];
    }
};

2021.5.16
题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”
把数字翻译成字符串类似,两个题目转化条件不一致。本题目0可以组成数字,链接中的题目0无法组成数字,因此需要变换一下动态规划的式子。
对于本题目不需要考虑某一位置为0的情况直接转化就行。对于大于两位的数字需要考虑前面一位数字和当前位组成的数字其范围是否在10~25之间,如果在dp[i]+=dp[i-2];

class Solution {
public:
    int translateNum(int num) {
        string nums = to_string(num);
        int n = nums.size();
        vector<int> dp(n+1,0);
        dp[0]=1;
        for(int i=1;i<=n;i++)
        {
            dp[i] = dp[i-1];
            if(i>=2)
            {
                int t = (nums[i-2]-'0')*10+ nums[i-1]-'0';
                if(t>=10 && t<=25)  dp[i]+=dp[i-2];
            }
        }
        return dp[n];
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值