这个题解通过动态规划的方式解决问题。首先将数字转换为字符串,以便于访问每一位数字。定义dp(i)为从字符串的第i位到最后一位可以有多少种解码方式。如果当前位和下一位组成的数字在10到25之间,那么这两位可以被解码为一个字符,因此dp(i) = dp(i-1) + dp(i-2),即考虑当前位单独解码和与下一位一起解码的情况。如果不在这个范围内,只能单独解码,因此dp(i) = dp(i-1)。递归的基情况是当i小于等于0时,返回1,表示至少有一种解码方式。最终,dp(len(str(num))-1)给出了从第0位到最后一位的解码方式总数。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def translateNum(self, num: int) -> int:
memo = dict() # 用来存储已经计算过的结果
def dp(i):
if i in memo: # 如果已计算过这个位置,直接返回结果
return memo[i]
if i <= 0: # 达到字符串起始位置,返回1表示一种解码方式
return 1
if 10 <= int(str(num)[i-1] + str(num)[i]) <= 25: # 如果两位数字可以合并解码
memo[i] = dp(i-1) + dp(i-2) # 加上合并解码的结果
else:
memo[i] = dp(i-1) # 不能合并,只考虑单独解码
return memo[i]
return dp(len(str(num))-1) # 从最后一位开始解析,返回总的解码方式数