题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
解题思路: 动态规划
我们定义dp[i]为前i位元素可以组成多少种排列. 那么 dp[i] 有2种情况
- 如果i位的与i-1位不能组成一个小于26的两位数, 那么dp[i] = dp[i-1]
- 如果可以组成两位数, 那么 dp[i] = dp[i-2] + dp[i-1] 即可以选择组成2位数排列或者不组成两位数排列(与爬楼梯类似)
示例代码
def translateNum(self, num: int) -> int:
s = str(num)
n = len(s)
dp = [1 for _ in range(n + 1)]
for i in range(2, len(s) + 1):
temp = s[i - 2]
if temp == "1" or (temp == "2" and s[i - 1] < "6"):
dp[i] = dp[i - 2] + dp[i - 1]
else:
dp[i] = dp[i - 1]
return dp[len(s)]