把数字翻译成字符串,动态规划,时间O(n), 空间O(1)
数组任何一个位置的数字,既可以只看当前位置组成个位数,也可以结合之前位置构成多位数。由于字母编码只在1-26之间,所以只有两种方式——只取当前数字组成1位数编码或者取当前位置+前一个位置组成两位数编码。如果以nums[:i+1]译成字符串的可能数为状态dp[i],它可以由dp[i-1]和dp[i-2]转移而来,这很类似于跳台阶,不过这里并不是每次都可以从两个地方来,需要满足条件。
class Solution: def solve(self , nums: str) -> int: dp1 = dp2 = 1 # dp1与dp2分别表示前一个与前两个的状态 for i in range(1, len(nums)): if nums[i] != '0' and 10 <= int(nums[i-1:i+1]) <= 26: dp1, dp2 = dp1+dp2, dp1 # 前一个与前两个状态均可达 elif nums[i] == '0' and 10 <= int(nums[i-1:i+1]) <= 26: dp1, dp2 = dp2, dp1 # 仅仅前两个状态可达 elif nums[i] != '0' and not 10 <= int(nums[i-1:i+1]) <= 26: dp1, dp2 = dp1, dp1 # 仅仅前一个状态可达 else: dp1, dp2 = 0, dp1 # 没有状态可达 return dp1