JZ46 [剑指 Offer 46] 把数字翻译成字符串

题目:

把数字翻译成字符串

CategoryDifficultyLikesDislikes
lcofMedium (52.26%)453-

 

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

示例 1:

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

提示:

  • 0 <= num < 231

知识点:

动态规划

分析:

str[]str[0]str[1]str[2]str[3]str[4]...str[n-1]
num[]12258...
dp[]dp[0]=1dp[1]=1dp[2]=dp[3]=dp[4]=dp[5]=...dp[n]

动态规划步骤:

   1、满足无后性:与前面状态有关,长度N与种数有关,长度N的字符种数与N-1的状态有关(能否组成一个字符)。

   2、中间数组状态:种数与长度一个变量有关,dp为一维数组

   3、递推方程式:见代码分析

   4、边界:见代码分析

代码:

/*
 * @lc app=leetcode.cn id=100325 lang=cpp
 *
 * [剑指 Offer 46] 把数字翻译成字符串
 */

// @lc code=start

/* 分析
    1、第n个字符的种数与第n-1个字符种数有关(大于或小于25)
    2、种数只与长度有关,dp为一维数组
    3、决定状态(递推公式):
        n-1与n  > 25: dp[i] = dp[i-1],只能组成两个字母
        n-1与n <= 25: dp[i] = dp[i-1] + dp[i-2],能组成单个字母和两个字母
    4、边界:dp[0] = 1, dp[1] = 1; 
*/

class Solution {
public:
    int translateNum(int num) {
        if(num < 0 ) return 0;
        if(num < 10) return 1;
        
        string str(to_string(num));
        vector<int> dp(str.length()+1);
        
        //初始化边界条件
        dp[0] = 1; 
        dp[1] = 1;

        //递推计算
        for(int i=2; i < dp.size(); i++){
            int j = str[i-1]-'0' + (str[i-2]-'0') *10;
            if(j <= 25 && j >= 10){
                //两位可组成字符
                dp[i] = dp[i-1] + dp[i-2];
            }else {
                dp[i] = dp[i-1];
            }
        }
        return dp[str.length()];   
    } 
    
};
// @lc code=end

结果:

Accepted

  • 49/49 cases passed (0 ms)
  • Your runtime beats 100 % of cpp submissions
  • Your memory usage beats 92.74 % of cpp submissions (5.7 MB)

注意:

  506,只能组成 "fag",种数1

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值