给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
用了两种办法,一种是类比斐波那契数列的做法(自底向上),一种是从后到前的递归法(会有重复的运算)。
1.斐波那契数列
注意是上一个值和当前值组成一个数进行判断。a = int(str(num)[i-1] + str(num)[i])
class Solution(object):
def translateNum(self, num):
if num < 10:
return 1
if num > 9 and num < 100:
if int(str(num)[0] + str(num)[1]) >= 10 and int(str(num)[0] + str(num)[1]) <= 25:
return 2
else:
return 1
pre1 = 1
cur = 0
if int(str(num)[0] + str(num)[1]) >= 10 and int(str(num)[0] + str(num)[1]) <= 25:
pre2 = 2
else:
pre2 = 1
for i in range(2, len(str(num))):
if int(str(num)[i-1] + str(num)[i]) >= 10 and int(str(num)[i-1] + str(num)[i]) <= 25:
cur = pre2 + pre1
pre1, pre2 = pre2, cur
else:
cur = pre2
pre1, pre2 = pre2, cur
return cur
2.递归
只要是多拆分一种,就多一个1,说明有多一种可能。
class Solution(object):
def translateNum(self, num):
if num < 9:
return 1
if num % 100 >= 10 and num % 100 <= 25:
return self.translateNum(num//10) + self.translateNum(num//100)
else:
return self.translateNum(num // 10)
牛客网—太恶心了
题目描述
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。
现在给一串数字,返回有多少种可能的译码结果
0的带入会引发其他问题。
class Solution:
def solve(self , nums ):
if not nums:
return 0
dp = [0] * 3
while nums[0] == "0":
if len(nums) == 1:
return 0
nums = nums[1:]
dp[0] = 1
dp[1] = 1
dp[2] = 1
for i in range(1, len(nums)):
if nums[i-1] == "0":
if nums[i] == "0":
return 0
continue
if nums[i-1] == "1" and nums[i] != "0":
if i == 1:
dp[1] = 2
dp[2] = 2
else:
dp[2] = dp[0] + dp[1]
dp[0] = dp[1]
dp[1] = dp[2]
elif nums[i-1] == "2" and int(nums[i]) >= 0 and int(nums[i]) <= 6 and nums[i] != "0":
if i == 1:
dp[1] = 2
dp[2] = 2
else:
dp[2] = dp[0] + dp[1]
dp[0] = dp[1]
dp[1] = dp[2]
else:
if i == 1:
dp[1] = dp[0]
dp[2] = dp[1]
dp[2] = dp[1]
dp[0] = dp[1]
dp[1] = dp[2]
return dp[2]