题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
分析
分析以xy两个数字结尾可能的排列
- x=0时,xy只能被翻译为0y,不增加翻译方法
- x=1型,两种,y独立翻译(dp[i-1])和xy合并翻译dp[i-2]
- xy>=10&小于25,同x=1型
- 大于25,一种,x独立翻译
假设nums[i]是第i个元素,dp[i]是以第i个元素结尾的翻译方法个数
dp[i] = dp[i-1] (0x型和大于25型)
dp[i] = dp[i-1]+dp[i-2] (10~25型)
代码
func translateNum(num int) int {
if num < 10 {
return 1
}
dp1 := 1
dpI1 := 1
dpI2 := 1
numStr := strconv.Itoa(num)
for i := 2; i <= len(numStr); i++ {
n, _ := strconv.Atoi(numStr[i-2 : i])
if n < 10 || n > 25 {
dp1 = dpI1
} else {
dp1 = dpI2 + dpI1
}
dpI2 = dpI1
dpI1 = dp1
}
return dp1
}