把数字翻译成字符串,动态规划,时间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