题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
思路
只有一位数字,编码方案f(1)有1种;
有两位数字,编码方案可以可以有1种(每一位单独编码),或者2种(当这两位组成的数字位于【10,25】之间)
三位数字:
- f(3) = f(2) + f(1) ———-f(2)表示第3位单独翻译;f(1)表示23位一起翻译(当这两位组成的数字位于【10,25】之间)
- f(3) = f(2) ———-2、3位组成的数字位于不在【10,25】之间
……
因此,f(n) = f(n-1) + f(n-2)或者f(n) = f(n-1)。
代码
class Solution:
def translateNum(self, num: int) -> int:
num = str(num)
length = len(num)
a, b = 1, 1
for i in range(1, length):
if 10 <= int(num[i-1:i+1]) <= 25:
a, b = b, a+b
else:
a, b = b, b
return b
class Solution:
def translateNum(self, num: int) -> int:
num = str(num)
length = len(num)
memo = [0]*(length)
memo[0] = 1 # 只有一个数字,只有一种翻译
if length == 1:
return memo[0]
if 10 <= int(num[:2]) <= 25:
memo[1] = 2
else:
memo[1] = 1
for i in range(2, length):
if 10 <= int(num[i-1:i+1]) <= 25:
memo[i] = memo[i-1] + memo[i-2]
else:
memo[i] = memo[i-1]
return memo[-1]