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

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

示例 1:

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

提示:

0 <= num < 231

思路

思路参考:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/solution/mian-shi-ti-46-ba-shu-zi-fan-yi-cheng-zi-fu-chua-6/

有点像青蛙跳台阶的题目,每次向前前进一格,或者向前前进两格,最后中跳上n个台阶的一共的方式种数有dp[n] = dp[n-1]+dp[n-2]
一次跳2格是有条件的,就是前后两各数字组成的2位数必须在[10, 25]之间
所以状态转移方程为dp = dp[n-1]  当XnXn-1不在[10, 25]区间时
dp = dp[n-1] + dp[n-2], 当XnXn-1在[10, 25]区间时
 1 class Solution {2     public int translateNum(int num) {3         4         // 为方便索引,把num转换成字符串5         String str = String.valueOf(num);6         int len = str.length();7         int[] dp = new int[len+1];8 9         dp[0] = 1;
10         dp[1] = 1;
11         for(int i = 2; i <= len; i++){
12             String tmp = str.substring(i-2, i);
13             if(tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0){
14                 dp[i] = dp[i-1] + dp[i-2];
15             }else{
16                 dp[i] = dp[i-1];
17             }
18         }
19         return dp[len];
20     }
21 }

leetcode执行用时:0 ms > 100.00%, 内存消耗:35.8 MB > 8.40%

复杂度分析:

时间复杂度:把数字num的每一位都遍历了一遍,所以时间复杂度为O(n)

空间复杂度:把数字转换成了字符串,需要一个O(n)的空间,另外还需要一个dp数组,所以一共需要O(2n)的空间

改进-空间优化

发现其实每个dp[i]只和dp[i-1] 和 dp[i-2]有关,所以只需要两个局部变量不断迭代即可,可以省去dp数组的空间复杂度

 1 class Solution {2     public int translateNum(int num) {3         4         // 为方便索引,把num转换成字符串5         String str = String.valueOf(num);6         int len = str.length();7         // int[] dp = new int[len+1];8 9         int a = 1;
10         int b = 1;
11         int res = 0;
12         for(int i = 2; i <= len; i++){
13             String tmp = str.substring(i-2, i);
14             if(tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0){
15                 res = a + b;
16             }else{
17                 res = a;
18             }
19             b = a;
20             a = res;
21         }
22         return a;
23     }
24 }

leetcode执行用时:0 ms > 100.00%, 内存消耗:35.6 MB > 55.83%

复杂度分析:

时间复杂度:把数字num的每一位都遍历了一遍,所以时间复杂度为O(n)

空间复杂度:把数字转换成了字符串,需要一个O(n)的空间,所以一共需要O(n)的空间

leetcode 剑指 Offer 46. 把数字翻译成字符串相关推荐

  1. 126. Leetcode 剑指 Offer 46. 把数字翻译成字符串 (动态规划- 字符串系列)

    class Solution:def translateNum(self, num: int) -> int:nums = str(num)n = len(nums)#异常情况if n < ...

  2. 【LeetCode】剑指 Offer 46. 把数字翻译成字符串

    [LeetCode]剑指 Offer 46. 把数字翻译成字符串 文章目录 [LeetCode]剑指 Offer 46. 把数字翻译成字符串 package offer;public class So ...

  3. 剑指 Offer 46. 把数字翻译成字符串(动态规划+回溯+递归 解法)

    剑指 Offer 46. 把数字翻译成字符串 问题描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...

  4. 【算法】剑指 Offer 46. 把数字翻译成字符串

    1.概述 剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...

  5. 【LeetCode笔记】剑指 Offer 46. 把数字翻译成字符串(Java、字符串、动态规划、DFS)

    文章目录 题目描述 思路 && 代码 1. 动态规划做法 2. DFS 做法 二刷 打卡第六天~继续加油! 题目描述 万物皆可爬楼梯.-和爬楼梯原理很像,都是使用动态规划的做法来做~ ...

  6. Leetcode刷题笔记——剑指 Offer 46. 把数字翻译成字符串(中等)

    文章目录 题目描述 解法:动态规划 方法一:字符串遍历 复杂度分析 C++代码实现 方法二:数字求余 复杂度分析 C++代码实现 参考链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 ...

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

    题目描述: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 ...

  8. 【千字分析】剑指 Offer 46. 把数字翻译成字符串

    我是小张同学,立志用更简洁的代码做更高效的表达 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 & ...

  9. 【剑指 Offer 46. 把数字翻译成字符串】【剑指 Offer 10- II. 青蛙跳台阶问题】【198. 打家劫舍】【动态规划】

    青蛙跳台阶,打家劫舍,字母相同编码三道题思路总结 总结我自己思路的,写的不详细,想看详细的可以跳转到我加的链接,都是力扣上同一个人写的题解,很厉害. 字符串翻译数字 字符串翻译数字 当最后一位数字单独 ...

最新文章

  1. 从0搭建一个Springboot+vue前后端分离项目(八)把数据从后台传到前端进行展示渲染,完善增删改查
  2. Dockerfile指令详解: CMD 容器启动命令
  3. 【客户下单】前端系统Action数据封装
  4. 开发Teams的messaging extension
  5. 上学帮:阿里云助力教育资讯平台防爬虫
  6. linux13位时间戳,Kotlin 处理Linux时间戳
  7. BZOJ 4520: [Cqoi2016]K远点对
  8. MYSQL 开发技巧
  9. MYISAM表的.frm、MYI损坏,丢失的修复方法
  10. C#中用ToString方法格式化时间
  11. [Tips]git cannot lock ref
  12. freebasic 编译linux,FreeBasic(basic语言编译器)0.90.1官网版
  13. 关于一些常见的矢量格式图(SVG,EPS,wmf,emf)
  14. SC-02-04-外包软件开发SOW工作说明书
  15. 利用R语言进行具有周期性的时间序列分析
  16. 独家| 阿里腾讯大裁员!一鲸落,万物生,一切才刚刚开始
  17. Vue进阶(幺捌零):Vue优质开源项目汇总(持续更新中...)
  18. 总结DH密钥协商(会话密钥)
  19. HTML 前端设置浏览器页签图标设置
  20. 看不见的竞争 之 把握意见领袖

热门文章

  1. 304413存储过程和触发器
  2. 未名湖边的烦恼引起的递归问题探讨
  3. java自动化测试框架基础eclipse+maven配置
  4. 来自Gartner 中国分析师的最新见解
  5. 编程论坛手机客户端 ~太强悍了
  6. git如何修改其不区分文件大小写(默认忽略大小写)的设置
  7. TIA portal西门子博途中优化的DB块和标准DB块的区别
  8. SQL16 查找GPA最高值
  9. 前端开发如何获取视频第一帧作为封面
  10. 【实战】使用Bert微调完成文本二分类