Decode Ways 解题心得

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
    输出该字符串可能解码得到的字母序列数量

  • 隐含条件:

    1. 输入的字符串序列中每个字符的范围是’0’-‘9’
    2. 可转换为字母的情况只有一位数字和两位数字

解题思路

动态规划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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值