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'了
网友评论