LEETCODE今日题
对于一个映射:字母—数字(数字要么是两位数,要么是一位数)
动态规划:
状态:DP[ i ]表示字符串前 i 个数字的解码方法总数
状态转移方程:
- 若最后一个数字可以被解码,即最后一个数字在1至9之间,被解码为A至I,则DP[ i ] = DP [ i - 1 ];
- 若最后两位数字可以被解码,即最后两个数字在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 )