剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 2^31
解题思路
使用回溯算法, 暴力枚举所有的情况。
private char[] c;
//
private int count;
public int translateNum(int num) {
c = String.valueOf(num).toCharArray();
backtrack(c, 0, c.length);
return count;
}
public void backtrack(char[] c, int index, int length) {
// 递归出口
if (index >= length) {
count++;
return;
}
// 当前数字单独翻译, 然后递归当前数字后面的字符串
backtrack(c, index + 1, length);
if (canTranslate(index, 2)) {
// 如果后边紧跟的数字可以和当前数字一起翻译, 则递归这两个字符后边的字符串
backtrack(c, index + 2, length);
}
}
// 判断从index字符开始, 长度为len的字符是否可以翻译为字符串
public boolean canTranslate(int index, int len) {
// 单个字符的范围是0-9, 是一定可以翻译的
if (len == 1) {
return true;
}
// 最后一个元素下标已经越界了, 直接返回false
if (index + len - 1 >= c.length) {
return false;
}
// 对于len = 2的情况, 那么只能是00-25之间的数字才能翻译
return c[index] == '1' || (c[index] == '2' && c[index+1] <= '5');
}