把数字翻译成字符串python_LeetCode 面试题46. 把数字翻译成字符串 | Python
面试题46. 把数字翻译成字符串
题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 231
解题思路
思路:动态规划
先理清题意,题目中说明规则: 0 翻译成 "a", 1 翻译成 "b",...,25 翻译成 "z"。而且题目中也说明【一个数字可能有多个翻译】。那么这里就可以想到,当数字大于等于 10 小于等于 25 的时候,这部分的数字可以看出是两个单独数字组成,或者单独当成一个数字。
现在看示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
看下面的解释中,我们可以看到:
"bccfi" 这种情况就是将所有的数字单独翻译,即是 [1, 2 ,2, 5, 8]
剩下的 4 个就是连续两位数字可考虑组合的情况
[1, 22, 5, 8] 对应翻译的是 "bwfi"
[1, 2, 25, 8] 对应翻译的是 "bczi"
[12, 2, 5, 8] 对应翻译的是 "mcfi"
[12, 25, 8] 对应翻译的是 "mzi"
在上面的示例中,'58' 这个组合是不成立的,我们知道组合的数字的范围应该落在 [10, 25] 之间。
那么也就是说,翻译的规则,在字符串的第 i 个位置中可以分为两种情况:
单独进行翻译
如果与 i - 1 位能够组合成数字且落在 [10, 25],那么可以连起来翻译。
现在假设将题目给出的数字 num 第 i 个数字记为 $x_i$,例如示例中的 num = 12258,那么 $x_1$ 就是 1。
现在定义动态规划列表 dp,假设 dp[i] 为 $x_i$ 结尾的数字的翻译方案。
按照前面得出的翻译规则总结出转移方程。
当 $x_{i-1}$ 和 $x_i$ 两个数字组合可被翻译时,这里就会有两种情况。单独翻译,或者组合翻译。也就是:
当组合翻译的时候,$x_{i-1}x_i$ 组合确定,前面 i-2 个数的翻译方案为 dp[i-2]。
当单独翻译的时候,$x_i$ 确定,前面 i-1 个数的翻译方案为 dp[i-1]。
也就是说当 $x_{i-1}$ 和 $x_i$ 两个数字组合可被翻译的时候,可由上述两种情况结合,最终 dp[i] = dp[i-2] + dp[i-1]。
如果 $x_{i-1}$ 和 $x_i$ 两个数字无法组合,那么就只能当成单个数字进行翻译。所以 dp[i] = dp[i-1]。
这里需要注意的可组合数字落在的区间是 [10, 25],前面已经说明了,只有这种情况才能够成功组合被翻译。
还有一种情况,就是 $x_{i-1}$ 为 0 的时候,这种情况可以会出现 00, 01, 02, ... 这样的组合数字。但是这种情况是不能够被翻译的。
所以最终的状态转移方程,以及具体落在的区间:
$$
dp[i] =
\begin{cases}
dp[i-2] + dp[i-1], & 10x_{i-1} + x_i \in [10, 25] \
dp[i-1] & 10x_{i-1} + x_i \in [0, 10) \bigcup (25, 99]
\end{cases}
$$
注意,这里我们并不考虑三位数的组合
在这里,dp[i] 表示的是以 $x_i$ 结尾的数字的翻译方案。当 i=0 和 i=1 的时候,表示的是【无数字】和【第一个数字】。这里都初始化为 1。(前面说明了 $x_1$ 表示的是第 1 个数字,如题目 12258 中的第一个数字 1。)
反向推导 dp[0] 的值,假设当出现两个数字能够组合且被翻译的情况下,例如 12,那么 dp[2] 显然是等于 2。要么以 [1, 2] 的形式,要么以 [12] 的形式进行翻译。
此时 dp[2] = dp[1] + dp[0] = 2,而 dp[1] 为 1,那么 dp[0] = 1。
而最终我们需要求得的结果就是 dp[n],也就是题目中所需求的翻译方案(n 表示的是数字长度。)
在这里可以使用字符串截取的方法去实现,这里需要将数字下转换为字符串,缺点是字符串会占用一定的空间。这里采用字符串截取的方法来求解。还有一种方法是使用取模的方法(可考虑尝试)
具体的代码如下。
代码实现
class Solution:
def translateNum(self, num: int) -> int:
string = str(num)
n = len(string)
dp = [0] * (n+1)
dp[0]=1
dp[1]=1
for i in range(2, n + 1):
if "10" <= string[i-2:i] <="25":
dp[i] = dp[i-1] + dp[i-2]
else:
dp[i] = dp[i-1]
return dp[n]
实现结果
总结
本题使用的动态规划,先分析题意,找出翻译的规则。可以发现,当第 i 个数字被翻译的时候,可能出现两种情况:
单独翻译第 i 个位置的数字
当第 i 个位置的数字与第 i-1 位置的数字组合且可被翻译,那么可考虑组合进行翻译
根据上面的翻译规则,可以求得转移方程(具体参考上面的解析):
当两个连续数字能够组合的情况下:dp[i] = dp[i-2]+dp[i-1]
否则:dp[i]=dp[i-1]
对动态规划列表进行初始化,确定最终求解的值为 dp[n]。
把数字翻译成字符串python_LeetCode 面试题46. 把数字翻译成字符串 | Python相关推荐
- leetcode面试题46. 把数字翻译成字符串
leetcode面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:**0 翻译成 "a" ,1 翻译成 "b",--,11 翻译 ...
- leetcode刷题-面试题46. 把数字翻译成字符串
面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...
- 面试题46. 把数字翻译成字符串
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 题解:https://leetcode-cn. ...
- 剑指Offer - 面试题46. 把数字翻译成字符串(DP)
1. 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0 翻译成 "a" , 1 翻译成 "b",--, 11 翻译成 "l",-- ...
- 【剑指offer】面试题46. 把数字翻译成字符串(java)
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 翻译成 & ...
- [剑指 offer] -- 动态规划-- 面试题46. 把数字翻译成字符串
1 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,2 ...
- leetcode面试题46. 把数字翻译成字符串/典型的青蛙跳台阶题目(递归),动态规划
文章目录 题目 基本思想 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l&q ...
- 力扣 面试题46. 把数字翻译成字符串 dp
https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 思路:为了方便,我们把输入转换成一个字符串,并且下标 ...
- leetcode 题库46. 把数字翻译成字符串
面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...
最新文章
- C++基本语法的知识体系
- 使用Native API 创建进程
- 想看Vue文档,cn放错位置,误入xx网站...
- IOS下,javascript字符串转日期类型错误
- js 和java有关系吗,javascript和JAVA有什么关系
- Python二级笔记(7)
- 根据坐标如何在matlab中l连成曲线,matlab中,如何将两条曲线画在一个坐标系里,plot(x1,x2,y1,y2)还是怎样...
- 谷歌浏览器安卓版_谷歌Chrome Canary 82安卓版现可复制图片到剪贴板
- FOJ 1887 景区摊位安排问题
- Http client to POST using multipart/form-data
- LT8619B 产品功能概述 HDMI1080P转BT1120
- 和利时dcs系统服务器设置,和利时DCS控制系统组态流程
- eclipse如何用php,phpeclipse使用详解
- 将Ubuntu中文目录改为英文目录
- 百度地图-根据地址获取经纬度
- 深度学习:GCN图分类案例
- OneZero第四次站立会议(2016.3.24)
- 程序人生hello-P2P
- CSS 设置页面缩放
- 快速入门Spring之SpringIOC
热门文章
- android 4.4 + 默认短信概念
- idea启动项目 报错类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。
- 运行build.xml ,出现 Error starting Sun's native2ascii
- 微信小程序canvas 2d 绘制图片与文字 导出图片
- 俄罗斯陨石坠落伤者超过100人
- 使用Echarts制作图表基础教程
- 骨传导耳机哪款音质更好、音质较好的骨传导蓝牙耳机推荐
- JS——appendChild()和insertBefore()插入新节点区别
- “扔瓶子”手残党们有救了
- ie浏览器java 脚本下载_如何设置ie浏览器中的activex控件和插件java脚本下载用户验证...