【Leetcode】91. Decode Ways

1 使用动态规划来解

2 这里额外的空间就是dp[i-1]和dp[i-2],时间复杂度是O(n)

3 有时候只需要知道有多少种方法,但不需要具体列出方法的题,可以使用动态规划

4 假设当前字符是z,z的前两个是xy,也就是xyz,会产生如下情况:

    a,当z=0,而且y=1或者2的时候,因为10或者20只有一种解释,所以dp[i]=dp[i-2]; 

    b,如果z=0,y不等于1也不等于2的时候,dp[i]=0,比如130,不存在decode的方式

    c,如果z=1到9,这时候不仅要考虑自己,也还要考虑和前面一位结合的情况。当前一位是1,或者前一位是2,且这一位是1到6,这种情况下会产生新的编码,因为既有当前位独立的编码,也有和前面一位组合起来的编码;

    d,z单独编码的时候,dp[i]=dp[i-1],因为添加一个独立存在的字符并没有添加可能性

    e,z和y组合的情况,dp[i]=dp[i-2], 因为zy组合形成一种编码,对于dp[i-2]来说,并没有增加可能性

    f,综合d和e,得到dp[i]=dp[i-1]+dp[i-2]

   g, 如果前面以为不是1或者2,那z只能单独编码,所以dp[i]=dp[i-1]


5 同时需要知道dp[0] 和 dp[1]:当s[0]不等于0的时候,dp[0]=1;当s[0]等于0的时候,dp[0]=0。dp[1]和上面分析的通用情况是一样的


6 注意len(s)>1的时候,才有dp[1]出现,所以需要添加一个if len(s)>1的条件

7 ‘1’<=s[i]<='6',开始写错了,写成‘1’=<s[i]<='6'了


1 初始化dp时都初始化成1

2 current digit是‘7’,‘8’, ‘9’时,要注意前一位为1时的情形



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容