把数字翻译成字符串(动态规划)
参考:
https://www.jianshu.com/p/80e1841909b7
题目要求:
给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。
递推公式:
f(i) = f(i+1)+ g(i,i+1)*f(i+2) , g(i,i+1)={0,1} (1)
f(i)表示 从第 i 位开始翻译方法的个数
从这就可以看出和青蛙跳类似,一次跳1个台阶,或者两个(两个的时候要用条件判断下)
书中说的,从前往后算,会有重复计算,所以从后往前算(自下而上)(但公式(1)的计算仍然是从前往后)
#include<iostream>
#include<sstream>
#include<string>
using namespace std;int get_ans_string(string s)
{int f2 = 1,f1 = 1, g = 0; // f2代表跳1次,剩余的情况;f1代表跳两次剩余的情况;// 每次更新的时候,当前计算出的 总的情况数,为下一次的f2;// 当前的 f2 ,为下一次 的 f1;// cout<<"s.size(): "<<s.size()<<endl;for (int i=s.size()-2;i>=0;i--){string tmps = s.substr(i,2);int tmpint;stringstream ss;ss<<tmps;ss>>tmpint;if (tmpint>=10 && tmpint<=25)g = 1;int tmpf= f2;f2 = f2 + g*f1;f1 = tmpf;}return f2;}int get_ans_num(int n)
{if (n<0)return 0;return get_ans_string(to_string(n));}int main()
{int n;cin>>n;int ans = get_ans_num(n);// cout<<n<<endl;cout<<ans<<endl;getchar();return 0;
}
leetcode上的一道题,注意0不能被编码
由于逆向考虑有点绕,就还从前往后考虑吧
https://leetcode.com/problems/decode-ways/submissions/
https://www.cnblogs.com/grandyang/p/4313384.html
https://zhuanlan.zhihu.com/p/60238439
注意申请dp的时候,多申请一个数。
dp数组的最开始的数相等于一个““辅助”数,其值为1,
dp[i]表示前i个数,能编码的个数;
如果当前数s[i-1]为0 , 则当前数必不能拆分,由此dp[i] = 0; 否则,可以拆分,因此dp[i] = dp[i-1]
然后再判断当前数能否和前一个数组合,如果可以,那么dp[i-2]的组合情况可以和当前组合和并,即可以加上dp[i-2]
class Solution {public:int numDecodings(string s) {if (s.empty()||s[0]=='0')return 0;vector<int>dp(s.size()+1,0);dp[0] = 1;for (int i=1;i<=s.size();i++){if (s[i-1]=='0')dp[i]=0;else if (s[i-1]!='0')dp[i] = dp[i-1];if (i>=2 && (s[i-2]=='1' || (s[i-2]=='2' && s[i-1]<='6'))) dp[i] += dp[i-2];}return dp.back();}
};
把数字翻译成字符串(动态规划)相关推荐
- 126. Leetcode 剑指 Offer 46. 把数字翻译成字符串 (动态规划- 字符串系列)
class Solution:def translateNum(self, num: int) -> int:nums = str(num)n = len(nums)#异常情况if n < ...
- 剑指 Offer 46. 把数字翻译成字符串(动态规划+回溯+递归 解法)
剑指 Offer 46. 把数字翻译成字符串 问题描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...
- 【LeetCode 剑指offer刷题】动态规划与贪婪法题3:剑指Offer-46:把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",--,11翻译成"1",--,25翻译成"z&qu ...
- 动态规划之青蛙跳台阶的应用(把数字翻译成字符串)
剑指 Offer 46. 把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...
- 【LeetCode】剑指 Offer 46. 把数字翻译成字符串
[LeetCode]剑指 Offer 46. 把数字翻译成字符串 文章目录 [LeetCode]剑指 Offer 46. 把数字翻译成字符串 package offer;public class So ...
- 【剑指Offer】个人学习笔记_46_把数字翻译成字符串
目录 题目: [剑指 Offer 46. 把数字翻译成字符串](https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan- ...
- 剑指offer46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串 难度:中等 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 ...
- leetcode面试题46. 把数字翻译成字符串
leetcode面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:**0 翻译成 "a" ,1 翻译成 "b",--,11 翻译 ...
- leetcode刷题-面试题46. 把数字翻译成字符串
面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...
- leetcode-剑指 Offer 46. 把数字翻译成字符串
leetcode-剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--, ...
最新文章
- 开源 免费 java CMS - FreeCMS-数据对象-link
- 《UNIX环境高级编程》--符号链接
- Oracle INTERVAL DAY TO SECOND数据类型
- 第三方控件radupload 使用方式以及报错处理
- Angular 动态控制 aside 标签显示和隐藏的一个例子
- efcore 新特性 SaveChanges Events
- 用python画一只可爱的皮卡丘_用python画一只可爱的皮卡丘实例
- 别克gl8服务器返回数据为空,老司机教学:别克GL8商务车总线控制系统故障解决...
- 71万买玛莎拉蒂,手续竟然全是假的:71万或打水漂
- springboot mysql事物_springboot如何开启数据库事务
- 山东建筑大学校内购物网(SdaiBuy.com )V1.2 Beta
- P2P网络借贷系统-核心功能-用户投标-业务解说
- navicat for mysql 破解版 中文免费
- “普通高中数学课程标准(实验)”解读
- latex不显示doi号
- 柳暗花明又一村 WiFi新应用实现3D物体成像
- “锟斤拷“的前世今生
- diy一个android手机版下载,居然设计家DIY手机版下载-居然设计家DIY 安卓版v1.3.0.5-PC6安卓网...
- iOS在UIButton中换行
- ARM学习系列 ---- RISC和CISC概述