Decode Ways 解题心得
题目描述
Decode Ways I:https://leetcode.com/problems/decode-ways/description/
Decode Ways II:https://leetcode.com/problems/decode-ways-ii/description/
Decode Ways I/II 题目描述
定义如下映射
'A' -> 1
'B' -> 2
...
'Z' -> 26
则”12”可以解码为两种序列情况:”AB”(1, 2) or “L”(12)
Decode Ways II 引入:’*’ 可以任意代表‘0’-‘9’任意一个数字
题目要求:
输入一个数字字符串s
输出该字符串可能解码得到的字母序列数量隐含条件:
- 输入的字符串序列中每个字符的范围是’0’-‘9’
- 可转换为字母的情况只有一位数字和两位数字
解题思路
动态规划DP
设置解题状态F[i]
,表示以s[1]
开头s[i]
为结尾s的子字符串的可能解码序列可能情况
需要考虑的状态转移方程需要分类讨论:
F[i]=0;
if (s[i]!='0') F[i]=F[i]+F[i-1];
if (s.substr(i-1, 2).stoi()>=10&&s.substr(i-1, 2).stoi()<=26){
F[i]=F[i]+F[i-2];
}
分别考虑最后两位字母和最后一位字母的情况,当最后一位字母固定解码为一个字母,则考虑情况加入F[i-1]
的情况数
当最后两位字母组成的2位数字解码为一个字母时,则考虑情况加入F[i-2]
的情况数
对于Decode Ways II 也是一样,同样是考虑最后一位作为解码,和最后两位作为解码的Action,分两大类讨论
由于出现’‘,则加入F[i-1], F[i-2]
时需要分别乘上由于’‘引入的解码可能数
\\主要是需要对'*'再进行多重考虑
F[i]=F[i-1]*ways(s.substr(i,1))+F[i-2]*ways(s.substr(i,2));
其中int ways(string sub);
函数用于判断sub
的可能数
1. sub.size()==1
2. sub.size()==2
最后建议最好像我这样吧各种情况考虑进去,因为自己之前写的就是这样少考虑好多东西
my code address:
https://github.com/zhanzongyuan/leetcode/blob/master/091_Decode%20Ways.cpp
https://github.com/zhanzongyuan/leetcode/blob/master/639_Decode%20Ways%20II.cpp