美文网首页
剑指offer面试题46:把数字翻译成字符串

剑指offer面试题46:把数字翻译成字符串

作者: 奉灬孝 | 来源:发表于2021-08-30 19:11 被阅读0次

    给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a”,1翻译成"b”,...,11翻译成"I”,...., 25翻译成"z"。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

    示例1:

    输入:12258
    输出:5
    解释:12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
    提示:
    0 <= num < 2^31

    思路

    假设𝑥1𝑥2....𝑥𝑖−2的翻译方式为𝑓(𝑖−2)种
    假设𝑥1𝑥2....𝑥𝑖−2𝑥𝑖−1的翻译方式为𝑓(𝑖−1)种

    可以得出𝑥1𝑥2....𝑥𝑖−2𝑥𝑖−1𝑥𝑖的翻译方式

    1. 𝑥𝑖−1和𝑥𝑖可以组合翻译那就可以选择组合和不组合两种,组合就是𝑓(𝑖−2)种,不组合就是𝑓(𝑖−1)种,一共𝑓(𝑖−2)+𝑓(𝑖−1)种

    2. 𝑥𝑖−1和𝑥𝑖不可以组合翻译所以只有𝑓(𝑖−1)种

    由上面可以得出状态转移方程:


    image.png

    dp[1]=1,至于dp[0]为什么等于1,举例:131,当读到3是和前面的1可以组合翻译应该是dp[2]= dp[2-1]+dp[2-2],可以看出来dp[2]明显是2;所以dp[0]=1.
    注意:dp[1]才是以第一个字符结尾的翻译方案数而不是dp[0],dp[0]只是为了方程的一个值

    代码
    class Solution {
        public int translateNum(int num) {
        String str = num+"";
        String tmp="";
        int len = str.length();
        int []dp = new int[len+1];
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<len+1;i++){
           tmp = str.substring(i-2,i);
           if(tmp.compareTo("10")>=0&&tmp.compareTo("25")<=0){
                dp[i]=dp[i-1]+dp[i-2]; 
           }else{
               dp[i]=dp[i-1];
           } 
           
        }
        return dp[len];
        }
    }
    

    参考:
    把数字翻译成字符串

    相关文章

      网友评论

          本文标题:剑指offer面试题46:把数字翻译成字符串

          本文链接:https://www.haomeiwen.com/subject/fepoiltx.html