给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 231
动态规划
class Solution:
def translateNum(self, num: int) -> int:
int2str = str(num)
dp = [1, 1]
for i in range(len(int2str)-2, -1, -1):
if int2str[i] != '0' and int2str[i] + int2str[i+1] < '26':
dp.append(dp[-1] + dp[-2])
else:
dp.append(dp[-1])
return dp[-1]
优化一下空间
class Solution:
def translateNum(self, num: int) -> int:
s = str(num)
a = b = 1
for i in range(len(s) - 2, -1, -1):
a, b = (a + b if "10" <= s[i:i + 2] <= "25" else a), a
return a
从右和从左遍历都是一样的
class Solution:
def translateNum(self, num: int) -> int:
s = str(num)
a = b = 1
for i in range(2, len(s) + 1):
a, b = (a + b if "10" <= s[i - 2:i] <= "25" else a), a
return a
利用数字求余再度优化空间
class Solution:
def translateNum(self, num: int) -> int:
a = b = 1
y = num % 10
while num != 0:
num //= 10
x = num % 10
a, b = (a + b if 10 <= 10 * x + y <= 25 else a), a
y = x
return a