把数字翻译成字符串(递归,动态规划)
题目要求:
给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。
解题思路:
下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例:
自上而下,从最大的问题开始,递归 :12258/ \b+2258 m+258/ \ / \bc+258 bw+58 mc+58 mz+8/ \ \ \ \bcc+58 bcz+8 bwf+8 mcf+8 mzi/ \ \ \bccf+8 bczi bwfi mcfi/bccfi
有很多子问题被多次计算,比如258被翻译成几种这个子问题就被计算了两次。自下而上,动态规划,从最小的问题开始 :
f(r)表示以r为开始(r最小取0)到最右端所组成的数字能够翻译成字符串的种数。对于长度为n的数字,f(n)=0,f(n-1)=1,求f(0)。
递推公式为 f(r-2) = f(r-1)+g(r-2,r-1)*f(r);
其中,如果r-2,r-1能够翻译成字符,则g(r-2,r-1)=1,否则为0。
因此,对于12258:
f(5) = 0
f(4) = 1
f(3) = f(4)+0 = 1
f(2) = f(3)+f(4) = 2
f(1) = f(2)+f(3) = 3
f(0) = f(1)+f(2) = 5
public class P231_TranslateNumbersToStrings {
public static int getTranslationCount(int number){
if(number<0)
return 0;
if(number==1)
return 1;
return getTranslationCount(Integer.toString(number));
}
//动态规划,从右到左计算。
//f(r-2) = f(r-1)+g(r-2,r-1)*f(r);
//如果r-2,r-1能够翻译成字符,则g(r-2,r-1)=1,否则为0
public static int getTranslationCount(String number) {
int f1 = 0,f2 = 1,g = 0;
int temp;
for(int i=number.length()-2;i>=0;i--){
if(Integer.parseInt(number.charAt(i)+""+number.charAt(i+1))<26)
g = 1;
else
g = 0;
temp = f2;
f2 = f2+g*f1;
f1 = temp;
}
return f2;
}
public static void main(String[] args){
System.out.println(getTranslationCount(-10)); //0
System.out.println(getTranslationCount(1234)); //3
System.out.println(getTranslationCount(12258)); //5
}
}
链接:https://www.jianshu.com/p/80e1841909b7
把数字翻译成字符串(递归,动态规划)相关推荐
- 剑指 Offer 46. 把数字翻译成字符串(动态规划+回溯+递归 解法)
剑指 Offer 46. 把数字翻译成字符串 问题描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...
- [剑指offer][JAVA]面试题第[46]题[把数字翻译成字符串][递归][逆推]
[问题描述][中等] 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l", ...
- 剑指 Offer 46. 把数字翻译成字符串(动态规划)(和青蛙跳台阶相似)
(这个0的情况是用来递归的 真正输入只有0个的时候输出是0->看代码) class Solution {public:int translateNum(int num) {string str ...
- 【LeetCode 剑指offer刷题】动态规划与贪婪法题3:剑指Offer-46:把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",--,11翻译成"1",--,25翻译成"z&qu ...
- 动态规划之青蛙跳台阶的应用(把数字翻译成字符串)
剑指 Offer 46. 把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...
- 【剑指Offer】个人学习笔记_46_把数字翻译成字符串
目录 题目: [剑指 Offer 46. 把数字翻译成字符串](https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan- ...
- leetcode面试题46. 把数字翻译成字符串
leetcode面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:**0 翻译成 "a" ,1 翻译成 "b",--,11 翻译 ...
- leetcode-剑指 Offer 46. 把数字翻译成字符串
leetcode-剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--, ...
- 把数字翻译成字符串/斐波那契数列/青蛙跳台阶
今天做到剑指Offer中面试题46:把数字翻译成字符串,一看,这不是之前的斐波那契数列和青蛙跳台阶的翻版吗?遂记录一下解题思路. 题目:给定一个数字,我们按照如下规则把它翻译为字符串: 0 0 0 ...
- 【LeetCode】剑指 Offer 46. 把数字翻译成字符串
[LeetCode]剑指 Offer 46. 把数字翻译成字符串 文章目录 [LeetCode]剑指 Offer 46. 把数字翻译成字符串 package offer;public class So ...
最新文章
- summary+plan
- 新手攻略熔炉_【新手攻略】快速入门
- So Easy! 让开发人员更轻松的工具和资源
- CSS仿艺龙首页鼠标移入图片放大
- 基于 HanLP 的 ES 中文分词插件
- 动态代理:jdk和cglib区别
- 管程理解及用管程实现生产者消费者问题
- Android 进程间通信——AIDL
- css3中transform-style的用法
- 数据结构-----环形链表
- 谨以此送给所有单身的MM
- DAMA-DMBOK 数据治理功能框架
- Fedora14源代码获取方法----直接到官网去下载
- 无奇不有,20款国外便携式智能手机充电器
- Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
- 欧美游戏业者都挣多少钱
- python_面向对象编程
- java 日历计算农历和节假日的常用类(包括除夕的算法)
- openFeign夺命连环9问,这谁受得了?
- Web3 网络效应:五种心智模型
热门文章
- Obi Rope(Yanlz+Unity+柔性电缆+立钻哥哥+)
- 《UnityAPI.GameObject游戏对象》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+isStatic+SendMessage+Find+立钻哥哥++OK++)
- 蓝牙传输速率详细分析【针对蓝牙4.2]
- 应用之星破除行业门槛 零成本开发手机应用
- git push出现 remote: Support for password authentication was removed on August 13, 2021.
- 简单典型二阶系统_【文献选译】二阶弹性波动方程PML的简单实现
- 蚌埠学院计算机操作系统题库,蚌埠学院电子教务登录
- 服务器设置静态IP地址教程,在Ubuntu服务器18.04上设置静态IP地址
- Dell Latitude E6400找不到Broadcom USH及Contacted SmartCard驱动
- 度秘语音引擎app_语音引擎下载