剑指 Offer 46. 把数字翻译成字符串

123 阅读1分钟

题目

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

 

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

分析

分析以xy两个数字结尾可能的排列

  1. x=0时,xy只能被翻译为0y,不增加翻译方法
  2. x=1型,两种,y独立翻译(dp[i-1])和xy合并翻译dp[i-2]
  3. xy>=10&小于25,同x=1型
  4. 大于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
}