Medium | 剑指 Offer 46. 把数字翻译成字符串 | 回溯

剑指 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');
}
原文地址:https://www.cnblogs.com/chenrj97/p/14282278.html