题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258 有 5 种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 2^31
来源:LeetCode
思路
典型的递归深搜的题目。每次取出前一位和前两位数字来看,结果等于前一位与剩下的结果组合数,加上前两位与剩下的结果组合数。当然,如果前两位不能正确翻译成字母,则第二种情况组合数是 0。
解法
/**
* @param {number} num
* @return {number}
*/
const translateNum = num => {
const numString = String(num);
if (!numString) return 0;
if (numString.length === 1) return 1;
if (numString.length === 2) {
return 10 <= num && num <= 25 ? 2 : 1;
}
let result = translateNum(numString.slice(1));
const firstTwo = numString.slice(0, 2);
if (10 <= firstTwo && firstTwo <= 25) {
result += translateNum(numString.slice(2));
}
return result;
};