LeetCode 题解:91. 解码方法,动态规划,JavaScript,详细注释
原题链接:91. 解码方法
解题思路:
创建dp
数组的注意点:
根据题意,
s[0]
可能为'0'
或'1'
,我们可以简单推导出s[0]
的初始状态为:dp[1] = s[0] === '0' ? 0 : 1;
。而任意一个位置
dp[i]
的状态,最多可能和前两个位置有关。因此创建
s.length + 1
长度的dp
数组,并初始化dp[0] = 1
,保证可以向前查找两位的状态,也就是默认虚拟的s[-1]
位置是合规的编码。dp[i]对应的字符串位置为 s[i - 1]。
该题可以拆解为以下几种场景
s[i - 2] + s[i - 1]
的范围是10~26
:
* 编码为10
或20
,只存在一种编码方法,并且只与dp[i - 2]
有关,状态转移方程:dp[i] = dp[i - 2];
。
* 编码为11-19
或21-26
,当前状态与前两个状态有关,状态转移方程:dp[i] = dp[i - 1] + dp[i - 2];
。
s[i - 1]
为 0,由于10
或20
已经处理过,此时s[i - 2] + s[i - 1]
只有30
、40
、50
等一系列可能性,当前无法解码,可直接返回0
。s[i - 1]
为1-9
,此时不会产生新的编码方法,状态转移方程:dp[i] = dp[i - 1];
。
复制代码
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/29bb797d73860226b792ec51b】。文章转载请联系作者。
评论