LeetCode每日一题,91. 解码方法
先看题目描述
算法和思路
动态规划
- 状态方程:dp[i] 表示字符串 s[0:i - 1] 的解码方法总数,初始化 dp[0] = 1,表示空串有一种解码方法
- 状态转移方程:dp[i] 由两部分组成,分别对应两种情况。一个是使用一个字符的情况,只要 s[i - 1] 不为 0,就可以用一个字符解码,dp[i] = dp[i - 1];另一个是使用两个字符的情况,s[i - 2] 不为 0 且 s[i - 2] 和 s[i - 1] 组成的数字不超过 26,则可以使用两个字符解码,dp[i] = dp[i - 2]。将上面的两种状态转移方程在对应的条件满足时进行累加,就可得到 dp[i] 的值
- 最后返回 dp[n] 即可
注意:由于上面的状态转移方程使用到了 dp[i - 2],所以只有 i > 1 时才能进行转移。初始化边界条件 dp[0] = 1,若 s 的首字符不为 0 的话,dp[1] 也赋值为 1
算法源码
动态规划
1 | class Solution { |
可以看到状态转移方程中 dp[i] 只与 dp[i - 1] 和 dp[i - 2] 有关,因此可以使用滚动数组的方法来优化空间复杂度,代码如下
1 | class Solution { |
下面是一开始使用的 dfs 算法的代码,结果跑超时了
1 | class Solution { |