剑指 Offer 46. 把数字翻译成字符串 dp

地址   https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/

复制代码
给定一个数字,我们按照如下规则把它翻译为字符串:
0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。
请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。   示例
1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi""mzi"
复制代码

提示:
0 <= num < 231

解法

题目中 每一位的数字是必须要翻译成某一个字母的。
区别在于这一位的数字x是翻译成x对应的字母还是和前面的数字1结合成1x在翻译成对应的字母
或者和前面的数字2结合成2x翻译成对应的字母。

那么如果我们使用
dp[i]表示第i位的数字可以有的翻译方法数目

dp[i] = dp[i-1]
或者dp[i] = dp[i-1]+dp[i-2]

取决于i和i-1的数字能否结合成合法的对应的字母
数字1和后面的数字(0~9)均可组合
数字2和后面的数字(0~5)均可组合

 

复制代码
class Solution {
public:
    int dp[100];
    int translateNum(int num) {
        string s = to_string(num);
        dp[0]=1;
        if(s.size()==1) return dp[s.size()-1];
        if(s[0]=='1')dp[1]=dp[0]+1;
        else if(s[0]== '2' && s[1]>='0' && s[1] <= '5') dp[1] = dp[0]+1;
        else{dp[1] =1;}
        
        for(int i = 2;i<s.size();i++){
            if(s[i-1] == '1') dp[i] =dp[i-1] + dp[i-2];
            else if(s[i-1] == '2' && s[i] >='0' && s[i] <= '5') { cout << 'x'<< endl; dp[i] = dp[i-1]+dp[i-2];}
            else dp[i] = dp[i-1];
        }
        
        return dp[s.size()-1];
    }
};
复制代码

 

posted on   itdef  阅读(91)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示