Java-把数字翻译成字符串(力扣)

一、 题目描述

题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

二、 解题思路

由于a-z的字母所能表示的数字区间为0-25,而00-09不能被a-j翻译,所以一个数字的其中两位数字可以被一个字母代替前提是,这个两位数字必须处于10-25之间。
由于,一个数字能被翻译的方法的总数取决于这个数字子串的翻译方法总数,所以此题属于动态规划问题,即根据这个数字的子串的翻译方法总数,求得当前数字的翻译方法的总数。
例如1225:1 2 2 5,12 2 5,12 25,1 22 5,1 2 25。
122:1 2 2,12 2,1 22。
12:1 2,12。
例如1225:1 2 2 6,12 2 6,1 22 6。
122:1 2 2,12 2,1 22。
12:1 2,12。
由上例可知:
当数字的最后两位数处于0-9或26-99时,有translateNum(X1 … X(n-2) X(n-1) X(n))=translateNum(X1 … X(n-2))
只有当数字的最后两位在10-25之间,才有translateNum(X1 … X(n-2) X(n-1) X(n))=translateNum(X1 … X(n-2))+translateNum(X1 … X(n-2) X(n-1))
根据递归即可求解。

三、 代码

public class Test46 {
    public static int translateNum(int num) {
		int a,b,c,size;
        String str1,str2;
        if((num>=0&&num<10)||(num>=26&&num<100)){
            return 1;
        }
        else if (num>=10&&num<26){
            return 2;
        }else {
            //将数字转换为字符串
            str1 = String.valueOf(num);
            //数字的位数
            size = str1.length();
            str2 = str1.substring(size-2,size);
            //取数字的最后两位
            a = Integer.parseInt(str2);
            b = Integer.parseInt(str1.substring(0,size-1));
            c = Integer.parseInt(str1.substring(0,size-2));
            if (a<=25&&a>=10){
                return translateNum(b)+translateNum(c);
            }else {
                return translateNum(b);
            }
        }
    }
    public static void main(String[] args) {
        System.out.println(translateNum(1101));
    }
}

四、 测试用例

输入: 1101
输出: 3
解释: 1101有3种不同的翻译,分别是"bbab", “bkb”, “lab”

你可能感兴趣的:(Java-把数字翻译成字符串(力扣))