【Leetcode】【Medium】Decode Ways
2015-09-01 17:15
399 查看
A message containing letters from
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message
The number of ways decoding
解题思路:
使用动态规划的思想。
(一)
初始想法可以建立一个数组,数组的每一位保存对应字符串的每一位可能出现的解码方式,例如:
字符串321321312;其对应的截止到每一位可能存在的解码方式种类为:
3 - 1种
32 - 1种
321 - 2种
3213 - 3种
32132 - 5种
....
所以得到解码方式数组为:
原字符串S: 3 2 1 3 2 1 3 1 2
解码种类数组A: 1 1 2 3 5 8 16 16 32
发现:
(1)如果当前字符可以和上一个字符组成二元字符,例如'1'和'2'组成'12',那么A[i] = A[i-1] + A[i-2];
很好理解,等于将'1' '2'分开的解码种类与将'12'合起来的解码种类之和;
(2)如果当前字符不能和上一个字符组成二元字符,那么A[i] = A[i-1];
(二)
因此,进一步的思路是,不需要建立一个数组,只需要保存i-2和i-1的解码种类数就可以了,分别用r1和r2表示;
如果当前字符可以组成二元字符,那么当前字符的次数 = r1 + r2;
如果不能,当前字符次数 = r1;
(三)
进一步发现,只用r1和r2两个变量就够了
(1)每次遇到可以组成二元字符的字符时,就更新r1,使r2等于旧的r1:
r1= r1 + r2;
r2 = r1;
(2)当不能组成二元字符时,r1不变,更新r2为r1;
(3)最终返回r1;
注意:
如果当前字符是'0',如果将'0'单独算,则不能产生任何解码数,即解码数为0;
代码:
A-Zis 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.
解题思路:
使用动态规划的思想。
(一)
初始想法可以建立一个数组,数组的每一位保存对应字符串的每一位可能出现的解码方式,例如:
字符串321321312;其对应的截止到每一位可能存在的解码方式种类为:
3 - 1种
32 - 1种
321 - 2种
3213 - 3种
32132 - 5种
....
所以得到解码方式数组为:
原字符串S: 3 2 1 3 2 1 3 1 2
解码种类数组A: 1 1 2 3 5 8 16 16 32
发现:
(1)如果当前字符可以和上一个字符组成二元字符,例如'1'和'2'组成'12',那么A[i] = A[i-1] + A[i-2];
很好理解,等于将'1' '2'分开的解码种类与将'12'合起来的解码种类之和;
(2)如果当前字符不能和上一个字符组成二元字符,那么A[i] = A[i-1];
(二)
因此,进一步的思路是,不需要建立一个数组,只需要保存i-2和i-1的解码种类数就可以了,分别用r1和r2表示;
如果当前字符可以组成二元字符,那么当前字符的次数 = r1 + r2;
如果不能,当前字符次数 = r1;
(三)
进一步发现,只用r1和r2两个变量就够了
(1)每次遇到可以组成二元字符的字符时,就更新r1,使r2等于旧的r1:
r1= r1 + r2;
r2 = r1;
(2)当不能组成二元字符时,r1不变,更新r2为r1;
(3)最终返回r1;
注意:
如果当前字符是'0',如果将'0'单独算,则不能产生任何解码数,即解码数为0;
代码:
int numDecodings(string s) { if (!s.size() || s.front() == '0') return 0; int r1 = 1, r2 = 1; for (int i = 1; i < s.size(); i++) { if (s[i] == '0') r1 = 0; if (s[i - 1] == '1' || s[i - 1] == '2' && s[i] <= '6') { r1 = r2 + r1; r2 = r1 - r2; } else { r2 = r1; } } return r1; }
相关文章推荐
- Android图片高斯模糊的一些方法
- 编译最新版本ffmpeg 提供给CentOS Mono调用
- Android通过第三方应用将自己的应用信息分享出去
- 文字换行中word-wrap、white-space和word break的区别
- Learningspark10--Spark流
- 胜负猜想
- 19.UIDatePicker日期选择器
- 20.友盟社会化分享
- Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机
- 【面试题】-100盏灯
- 浏览器禁用后退
- ios原生二维码扫描
- mongo-kafka: mongodb 数据到kafka的实时传输
- Quartz2d研究笔记
- Javascript模块化编程(一):模块的写法
- [工作笔记之三] 通过adb查看android手机CPU和内存占用情况
- 17.setValue和setObject的区别
- 18.NSUserDefaults支持类型
- 从经典的MVC模式到Web三层结构
- CSS中的行为(css中使用js文件)——expression