639. 解码方法 II
原题地址:https://leetcode.cn/problems/decode-ways-ii/
题解
设dp[i][0]为第i个字符单独解析的组合数,dp[i][1]为第i个字符和前一个字符组合解析的组合数
本质的思想是根据前一个字符和当前字符的具体情况分类讨论DP
对于第i个字符单独解析的情况
- 当i为0时,无法单独解析
- dp[i][0]=0
- 当i为*时,可以解析为1-9中的任何一个数字,有9种情况
- 由于i单独解析,因此第i-1个字符无论是单独解析还是与i-2组合解析的情况都可以被算进来
- dp[i][0]=(dp[i-1][0]+dp[i-1][1])*9
- 当i为某数字时,i只能被解析为当前数字,只有1种情况
- dp[i][0]=(dp[i-1][0]+dp[i-1][1])*1
对于第i个字符组合解析的情况
- 当i-1为1时
- 当i为*时,可以解析为1-9中的任何一个数字,有9种情况
- 由于i组合解析,因此i-1也只能取单独解析的情况来和i组合
- dp[i][0]=dp[i-1][0]*9
- 当i为某数字时,i只能被解析为当前数字,只有1种情况
- dp[i][0]=dp[i-1][0]*1
- 当i-1为2时
- 当i为*时,i只能被解析为1-6中的任何一个数字,有6种情况
- dp[i][0]=dp[i-1][0]*6
- 当i<=6时,i可以被解析为当前数字,有1种情况
- dp[i][0]=dp[i-1][0]*1
- 当i>6时,i无法和i-1组合解析
- dp[i][0]=0
- 当i-1为*时
- 当i也为*时,由于无法被解析为0,因此二者只能解析为11
19,2126,共15种情况 - 由于这里是i-1和i作为一个整体计算的,因此应当乘以i-2的组合数
- dp[i][1]=(dp[i-2][0]+dp[i-2][1])*15;
- 当i<=6时,i-1可以被解析为1或2,i只能被解析为当前数字,有2种情况
- dp[i][1]=(dp[i-2][0]+dp[i-2][1])*2;
- 当i>6时,i-1可以被解析为1,i只能被解析为当前数字,有1种情况
- dp[i][1]=(dp[i-2][0]+dp[i-2][1])*1;
- 考虑到边界条件,当i<=1时,dp[i-2][0]+dp[i-2][1]应当等于1
- 当i也为*时,由于无法被解析为0,因此二者只能解析为11
最后记得将结果%=1e7即可
时间复杂度:O(N)
空间复杂度:O(N)
1 | class Solution { |
Comments