有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。
我们把一个字符串编码成一串数字,再考虑逆向编译成字符串。
由于没有分隔符,数字编码成字母可能有多种编译结果,例如 11 既可以看做是两个 'a' 也可以看做是一个 'k' 。但 10 只可能是 'j' ,因为 0 不能编译成任何结果。
现在给一串数字,返回有多少种可能的译码结果
在动态规划中,用dp[i]=dp[i-1]+dp[i-2]来解决两个编码分支的问题,判别条件则是数字范围是否在11到26之间。
def solve(nums ):
if nums=="0":
return 0;
if nums=="10" or nums=="20":
return 1
if nums[0]=="0":
return 0
for i in range(1,len(nums)):
if nums[i]=="0" and (nums[i-1]!="1" and nums[i-1]!="2"):
return 0
dp=[1 for _ in range(len(nums)+1)]
for i in range(2,len(nums)+1):
if (nums[i-2]=="1" and nums[i-1]!="0") or \
(nums[i-2]=="2" and (nums[i-1]>"0" and nums[i-1]<"7")):
dp[i]=dp[i-1]+dp[i-2]
else:
dp[i]=dp[i-1]
return dp[len(nums)]
|