题目描述:

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

示例 1:

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

提示:

0 <= num < 2^31

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

这道题没看题解自己写出来了,思路也算比较简单,递归+回溯。很容易发现的一个规律,对于1开头或者2开头的数字,如果和后面的数字组成的数组<=25,那么就有两种拼法。举个例子,23这个数字,如果每一位单独看,可以翻译成cd,如果连在一起看,就可以翻译成x。但对于36就不可以,因为整数36没有对应的字母,只能翻译成dg。

故此,如果在遇到一个数字时,如果他只能翻译成一个字母,那么就把这个字母加入到str中,继续进行下一次递归,递归返回后删除该字母。如果它还可以带着后面的数字一起翻译成一个字母,那就把组合而成的这个字母加入到str中,继续进行下一次递归,递归返回后删除该字母。

代码如下:

class Solution {
public:// res用来存放每个翻译结果vector<string> res;// 栈s用来存放数字的每一位stack<int> s;int translateNum(int num) {// 数字的每一位依次入栈while(num){int temp=num%10;s.push(temp);num=num/10;}// 进行递归string str="";dfs(str);// 返回结果return res.size();}void dfs(string str){// 如果栈为空,说明所有数字已经都翻译完了,本次翻译结果存入resif(s.empty()){res.push_back(str);return;}// 如果栈不空,那么获取栈顶元素int first=s.top();s.pop();// 翻译栈顶元素并加入strchar c='a'+first;str=str+c;// 进行下一次递归dfs(str);// 递归完成后删除刚才加入的字母str.erase(str.end()-1);// 如果栈不空if(!s.empty()){// 获取下一位数字和本数字组成一个新的数字temp,例如1和5组成15int second=s.top();s.pop();int temp=first*10+second;// 如果这个数字<=25,并且第一位为1或者2if(temp<=25&&(first==1||first==2)){// 就把这个组成的新数字翻译c='a'+temp;str=str+c;// 进行下一次递归dfs(str);// 递归完成后删除刚才加入的字母str.erase(str.end()-1);}// 把刚才弹出的第二个元素重新入栈s.push(second);}// 把刚才弹出的第一个元素重新入栈s.push(first);return;}
};

看了看题解,有另一种思路,是关于动态规划的,思路如下:

来源:leetcode用户 Krahets

链接: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/

代码如下:

class Solution {
public:int translateNum(int num) {// nums用来存储num的每一位vector<int> nums;// 如果num刚开始就为0,那么就把0假如numsif(num==0) nums.push_back(0);// 依次把num的每一位反向添加到nums中while(num){int temp=num%10;nums.push_back(temp);num=num/10;}// 反转numsreverse(nums.begin(),nums.end());// 申请一个数组dp,长度为nums的长度,dp[i]代表以i结尾的数字串可以翻译的种数int dp[nums.size()];// 第一个数字只有一种翻译方式dp[0]=1;// 如果num只有1位数字,那么直接返回一种翻译方式即可if(nums.size()==1)return 1;int temp=nums[0]*10+nums[1];// 来判断第二位数字有几种翻译方式,其实也是递推方程// 1.如果上一位数字无法与本位数字合并组成一种新的翻译方式,那么以本位数字结尾的数字串,翻译种数就是以上一位数字结尾的数字串的翻译种数// 即dp[i]=dp[i-1];// 2.如果上一位数字无可以与本位数字合并组成一种新的翻译方式,那么以本位数字结尾的数字串,翻译种数就是以上一位数字结尾的数字串的翻译种数+以上上一位数字结尾的数字串的翻译种数// 即dp[i]=dp[i-1]+dp[i-2];if((nums[0]==1||nums[0]==2)&&temp<=25)dp[1]=2;elsedp[1]=1;// 从第三位数字开始,应用递推方程for(int i=2;i<nums.size();i++){int temp=nums[i-1]*10+nums[i];if((nums[i-1]==1||nums[i-1]==2)&&temp<=25)dp[i]=dp[i-1]+dp[i-2];elsedp[i]=dp[i-1];}// 返回最后的总数return dp[nums.size()-1];}
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 【廖雪峰Python学习笔记】函数式编程
  2. ubuntu18安装很慢_双硬盘装Win 10+Ubuntu 18.04双系统中的一些坑
  3. Excel导出多sheet单sheet通用型(poi)
  4. pku 1486 求出二分匹配图中的必须边
  5. jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
  6. MessagePack 学习笔记
  7. 推荐一篇关于java集合的博文,写的很nice
  8. 转:Fiddler抓包工具总结
  9. gitlab 迁移_无忌过招:手把手教你搭建自己的GitLab库
  10. 部署mysql主从同步
  11. Android Material Design按钮样式设计
  12. Python数据处理(一)
  13. vue设置必填项和判断必填项是否填入的弹窗提示
  14. react中嵌入网页_react添加/嵌入 iframe
  15. 养什么最赚钱成本最低?盘点几个合适的项目!
  16. Linux 命令 技能
  17. IT30:30岁IT男未来10年规划第3篇(2009-2020)
  18. Python-苹果手机编程
  19. 120篇精华文章打包送,干货慎入!
  20. hostiko模板-WHMCS自适应模板-略站网

热门文章

  1. windows 10 开启vt-x
  2. (八)Colaboratory在谷歌云盘的使用
  3. 未名湖边的烦恼引起的递归问题探讨
  4. TRACY自己学英语的5W三七法则
  5. 画论63 俞蛟《读画闲评》
  6. Linux以太网卡架构解析-MAC层和PHY层
  7. UT源码_105032014126(改)
  8. 解决flash后台运行缓慢的问题(帧频低的问题)
  9. python爬虫微信_搜狗微信采集 —— python爬虫系列一
  10. 183亿超募,超千亿估值,埃安为什么引发全行业抢投