[LeetCode] Decode Ways [33]
题目
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
原题链接(点我)
解题思路及代码
解码方法数量问题。
英文26个字母相应1到26,给一串数字。问翻译为字母有多少种方法?
这个题第一思路是想到使用组合排列的方法,穷举全部的可能。非常好。写出例如以下代码
class Solution {
public:int numDecodings(string s) {int count = 0;helper(0, s, count);return count;}void helper(int start, const string& s, int& count){if(start == s.size()){++count;return;}int key=0;for(int i=start; i<s.size(); ++i){if(s[start] == '0') return;key = 10*key + s[i] - '0' ;if(key>26) return;helper(i+1, s, count);}}
};
可是提交后出来的结果是超时。
再想想,使用动态规划的方法来做。
对于串s[0...i]的解码数量应该和s[0...i-1], s[0...i-2]的解码数量有关系。
dp[i]: 代表s[0...i-1]的解码数量,
dp[i] = { (s[i-1]!='0')?dp[i-1]:0 } + { s[i-2...i-1]<='26' ? dp[i-2] : 0 } ;
代码例如以下:
class Solution {
public:int numDecodings(string s) {int n = s.size();if( n<=0 || s[0]=='0') return 0;vector<int> dp(n+1, 0);dp[1] = dp[0] = 1;for(int i=2; i<=n; ++i){if(s[i-1] != '0') dp[i] = dp[i-1];if(s[i-2]=='1' || (s[i-2]=='2'&&s[i-1]<'7'))dp[i] += dp[i-2];} return dp[n];}};
上述动态规划优化后能够仅仅使用3个变量而不是一个数组。代码例如以下:
class Solution {
public:int numDecodings(string s) {if(s.size()<=0 || s[0]=='0') return 0;int cur=0, cur_1 = 1, cur_2 = 1;for(int i=2; i<=s.size(); ++i){if(s[i-1] != '0') cur += cur_1;if(s[i-2]=='1' || (s[i-2]=='2'&&s[i-1]<'7'))cur += cur_2;cur_2 = cur_1, cur_1 = cur, cur = 0;}return cur_1;}
};
假设你认为本篇对你有收获,请帮顶。
[LeetCode] Decode Ways [33]相关推荐
- [LeetCode] Decode Ways
(Version 0.0) Decode Ways这道题从原理上说是一个比较简单的一维DP题目,用一个一维数组的元素dp[i] (i >= 1)来记录从头开始长度为i的substring有多少种 ...
- [leetcode]Decode Ways
动态规划.要注意way+=dp[i-1]或dp[i-2]以及way+=1的条件.我看有的人把数组命名为count的. public class Solution {public int numDeco ...
- LeetCode Decode Ways(动态规划)
题意:编码方式为a->1,...z->26,给出编码后的数字字符串,问有多种编码方式 思路:用dp(i)表示从第1个字符到第i个字符时的编码方式,因为编码一个字符时,只能是0-9,编码两个 ...
- LeetCode Decode Ways
有点意思的题目.用动态规划能够O(n)求解出来:a[i]代表子字符串string(0,i)的可能解码方式,a[i] = {a[i-1] or a[i-1]+a[i-2]}. 意思是假设string(i ...
- 【重点!DP】LeetCode 639. Decode Ways II
LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...
- 【DFS + 记忆化递归 + DP】LeetCode 91. Decode Ways
LeetCode 91. Decode Ways Solution1:我的答案 还是记录一下,最容易想到的是DFS,但是在第223/238个case上就超时了... class Solution { ...
- [LeetCode]91.Decode Ways
题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A ...
- 【LeetCode】91. Decode Ways 解题报告(Python)
[LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...
- Decode Ways leetcode java
题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...
- 91 Decode Ways
为什么我常常对做题产生恐惧,因为可能为了一个不算难的问题不知不觉绕进去2个小时,这显然是不值得的.这题就是如此. 还要注意,java && 的优先级高于||的优先级,而不是同级. pu ...
最新文章
- An internal error occurred during: Launching xxx on WebLogic10.x.
- Karrigell介绍
- java桌面应用程序打包为exe
- 竟然能从一维空间变换为四维空间!?
- mui.init方法配置
- docker run命令_CVE-2019-14271:Docker cp命令漏洞分析
- python矩阵后加点_Python Numpy和矩阵的相关面试问题
- poi数据导入arcgis,结合POI数据的道路自动选取方法
- ASP.NET核心之路微服务第01部分:构建视图
- Linux 下五个顶级的开源命令行 Shell
- 大学生动物介绍网页设计作品 dreamweaver作业静态HTML网页设计模板 保护动物网页作业制作
- 琵琶行用计算机弹,琵琶行中的三次弹奏
- python 百分号调用内置函数_打牢Python基础这12类内置函数你掌握了吗
- 2022款Thinkphp家政上门预约系统-全开源系统源码
- 前端上班第一天-开发环境配置
- 数据库(Mysql)----mysql建表中的约束
- (转)Linux系统下PDF文件的编辑
- 一种特殊的线性变换——正交变换
- Verilog语言实现设计交通灯控制器
- java工具类@Autowired注入失败