JZ69 把数字翻译为字符串

把数字翻译为字符串

题目:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

思路:递归,遍历数字的位,当前位翻译一种方法,如果当前位和下一位能结合成另一种翻译,则有可记录为一种方法。但是递归会找出重复计算,如12258会计算1,2258和12,258,而2258会2,258,我们定义f(i)表示从第i位数字开始的不同翻译的数目,那么f(i) = f(i + 1) + g(i,i + 1) * f(i + 2)。当第i位和第i + 1位两位数字拼接起来的数字在10 ~ 25的范围内时,函数g(i,i + 1)的值为1,否则为0.

有重复,可以使用动态规划。从后往前求,比记录翻译方法数。

 

import (
	"fmt"
	"strconv"
)

func translateNum(num int) int {
	numStr := strconv.Itoa(num)
	return translateCount(numStr)
}

func translateCount(numStr string) int {
	length := len(numStr)
	dp := make([]int, length+1)
	dp[length] = 1
	dp[length-1] = 1

	for i := length - 2; i >= 0; i-- {
		count := dp[i+1]
		digit1 := numStr[i] - '0'
		digit2 := numStr[i+1] - '0'
		converted := digit1*10 + digit2

		if converted >= 10 && converted <= 25 {
			count += dp[i+2]
		}

		dp[i] = count
	}

	return dp[0]
}

  

posted @ 2021-04-11 01:58  zqlucky  阅读(199)  评论(0编辑  收藏  举报