题目
-
给定一个数字,我们按照如下规则把它翻译为字符串
0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。
一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 -
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi” -
提示:
0 <= num < 231 -
leetcode链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/submissions/
思路
- 回溯算法
- 注意这里比较坑的是,0x才能表示一个数,如果0后面不跟非0的数,那么这个0没意义
代码
/**
* @param {number} num
* @return {number}
* 注意一个字母为0的时候
* 注意两个字母为0的时候
*/
var translateNum = function (num) {
const numStr = num.toString()
const result = new Set()
const path = []
const letters = 'abcdefghijklmnopqrstuvwxyz'
function backTracking(index) {
if (index >= numStr.length) {
result.add(path.join(''))
return
}
const oneLetter = numStr[index]
const oneLetterNum = +oneLetter
if (oneLetterNum !== 0 || index === numStr.length - 1) {
path.push(letters[oneLetterNum])
backTracking(index + 1)
path.pop()
} else {
backTracking(index + 1)
}
if (index < numStr.length - 1) {
const twoLetters = numStr.slice(index, index + 2)
const twoLettersNum = +twoLetters
if (twoLettersNum !== 0 || index + 1 === numStr.length - 1) {
if (twoLettersNum <= 25) {
path.push(letters[twoLettersNum])
backTracking(index + 2)
path.pop()
}
} else {
backTracking(index + 2)
}
}
}
backTracking(0)
return result.size
}