【LeetCode剑指offer46】把数字翻译成字符串(动态规划)

简介: 字母只有26个英文字母,数字上不超过2位数,本题本质上就是青蛙跳阶梯类型(数字可以是一位,或者两位),只不过需要赋值前进行判断。(1)确定

一、题目


image.png

二、思路

字母只有26个英文字母,数字上不超过2位数,本题本质上就是青蛙跳阶梯类型(数字可以是一位,或者两位),只不过需要赋值前进行判断。


(1)确定状态

dp[i]表示前i个数字的翻译方法可能个数。


(2)转移方程


只有两种情况可以进行组合翻译:


前一个数字为1是,则必然满足[10,25]区间,可以和当前数字组合翻译

若前一个数组为2,且当前数字<=5,则满足[10,25]区间,可以组合翻译

而如果是单独翻译,则翻译方法数不变:dp[i] = dp[i - 1]。


(3)初始条件+边界

dp[1] = 1没有问题,因为只有一个数字则肯定只有一种翻译方法,但是为了dp[2]计算中,如果当前两个数字能组合翻译时,是dp[2] = dp[1] + dp[0],这种情况的dp[2]应该为2,为了配合这个,我们需要设置dp[0] = 1。


(4)计算顺序

从小到大。


三、代码

class Solution {
public:
    int translateNum(int num) {
        if(num < 10){
            return 1; 
        }
        string strnum = to_string(num);
        vector<int> dp(strnum.size() + 1);
        //当前两个数字能组合翻译时,dp[2] = dp[1] + dp[0],
        //d[2]结果应该是2,dp[1]已知等于1,所以dp[0]也等于1
        dp[0] = 1;
        //一个数字只有一种翻译方法
        dp[1] = 1;
        for(int i = 2; i <= strnum.size(); i++){
            if(strnum[i - 2] == '1' ||
               (strnum[i - 2] == '2' && strnum[i - 1] <= '5')){
                dp[i] = dp[i - 1] + dp[i - 2];
            }else{
                //否则是单独翻译
                dp[i] = dp[i - 1];
            }
        }
        return dp[strnum.size()];
    }
};

image.png

相关文章
|
7天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
23 1
|
21天前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
22 9
|
21天前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
14 0
|
22天前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
27 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
52 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
102 2
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
5 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
49 7