题目要求:
给定一个数字,按照以下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不一样的翻译方法。git
# -*- coding: utf-8 -*- # @Time : 2019-07-10 21:13 # @Author : Jayce Wong # @ProjectName : job # @FileName : getTranslationCount.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce def getTranslationCount(number): """ 要将一个数字转化成一个字符串,因为这个数字有不少位,咱们最直观的就是从头开始,一位一位地去转化。 好比给定12258. 咱们能够先把1翻译成b,而后剩下2258;也能够先把12翻译成m,而后剩下258.。。 因而可知是一个递归问题,用递归的思路分析题目,用循环来解决问题(动态规划) 递推公式为:f(i) = f(i+1) + g(i, i+1) x f(i+2) 其中f(i)表示到下标为i的数字为止,共有多少种可能的翻译。之因此写成向前递推的公式,是由于若是我 们从前日后翻译,会出现不少重复的子问题,好比12258=1 | 2258,其中2258=2 | 258,而12258=12 | 258, 这样258就重复了。 因此咱们从后往前翻译,就能够避免这样的重复子问题。 """ def helper(s): # 一个数字至少有一种翻译,所以能够先设置一个全为1的数组,长度对应数字的位数加一 counts = [1] * (len(s) + 1) # 对于前面的n-1位 for i in range(len(s) - 2, -1, -1): # 第i位至少有和第i+1位同样多的翻译数 count = counts[i + 1] # 若是第i位和第i+1位能够组合成一个10-25的数字,那么g(i, i+1) = 1 # f(i) = f(i+1) + g(i, i+1) x f(i+2) # 因为咱们设置的数组长度是位数+1,所以这里i+2不可能越界 if 10 <= int(s[i: i + 2]) <= 25: count += counts[i + 2] counts[i] = count return counts[0] # 因为0对应a,25对应z,所以小于0的输入是无效的 if number < 0: return 0 return helper(str(number))