LEETCODE博客记录(2021.4.21)

LEETCODE今日题

在这里插入图片描述
对于一个映射:字母—数字(数字要么是两位数,要么是一位数)

动态规划:

状态:DP[ i ]表示字符串前 i 个数字的解码方法总数

状态转移方程:

  1. 若最后一个数字可以被解码,即最后一个数字在1至9之间,被解码为A至I,则DP[ i ] = DP [ i - 1 ];
  2. 若最后两位数字可以被解码,即最后两个数字在10至26之间,被解码为J至Z,则DP[ i ] = DP [ i - 2 ];

由于两种情况均可能存在,故最终有:
DP[ i ] = DP [ i - 1 ] + DP[ i - 2 ]

边界条件:
考虑到状态转移方程:
DP[ 1 ] = DP [ 0 ]
DP[ 2 ] = DP [ 1 ] + DP [ 0 ]
如果DP [ 1 ] 和 DP [ 2 ]已知,我们可以将DP [ 1 ] 和 DP [ 2 ] 作为边界条件,然后从 i = 3 开始从底向上进行动态规划,但是DP [ 1 ] 和 DP [ 2 ] 同样需要进行判断,而且利用到DP [ 0 ],DP [ 0 ]对应题意是没有意义的,在这里只是看作一个跳板来确定 DP [ 1 ] 和DP [ 2 ],我们假设字符串只有一个数字,且可以被解码,则 DP [ 1 ] = DP [ 0 ] = 1,于是边界条件就是DP [ 0 ] = 1;
至此,动态规划算法分析结束,代码如下:
在这里插入图片描述
时间复杂度为O(N)
空间复杂度为O(N)

考虑到状态转移方程只和DP [ i - 2 ] 和DP [ i - 1 ]和 DP [ i ] 有关于是我们可以利用类似滚动数组的方法进行优化,将空间复杂度减低至O( 1 ),代码如下:
在这里插入图片描述
在这里插入图片描述
时间复杂度为O( N )
空间复杂度为O( 1 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值