【爬台阶题型】剑指 Offer 46. 把数字翻译成字符串


剑指 Offer 46. 把数字翻译成字符串 - 力扣(LeetCode) (leetcode-cn.com)

这题 和 青蛙爬台阶是一样一样的。
一次爬一步,一次爬两步的区别
只不过,爬两步需要判断一下是否能爬而已其实和裴波那切公式一样

相关姐妹题型是 第91题。91. 解码方法

  • 翻译的条件就是: 字符串的第i个位置

    • 如果i所在的位置可以 单独作为一位去翻译
    • 如果i所在的位置 和第i-1所在的位置元素 组成的数字在10,25之间也可以翻译。

用dp[i] 表示: 以第i位结尾的前缀串翻译的方案为 dp[i]

考虑第i位单独翻译 和 与前一位连接起来再翻译对dp[i]的贡献。

  • 第i位 单独翻译 对dp[i]的 贡献为 dp[i-1]

  • 如果第i-1 位存在,且 第i-1位和第i位形成的数字x 满足10<=x<=25

    • 可以把第i-1位 和 第i位连接起来翻译,对dp[i]的贡献为dp[i-2]

举例:

  • 如果是1245, 第i位 5 只能选择单独翻译,为什么? 因为如果和前面一位 组合起来就是45 ,远远超过10,25的范围。

    • 那么dp[i] dp[4] (5) 以第4位结尾的前缀串“1245”的方案数量 和 dp[3]以第三位结尾的前缀串 “124” 的方案数量 是一样的。

      • 这么说比较难以理解,这么理解:

      • dp[4] 可以怎么转化呢? 他只能由前面一位推出来。因为当前这一位他不能组合!

      • dp[4] 只能由dp[3]推出来!! 所以dp[4]=dp[3]

      • 假设一下:

        • 124
          假设有3种组合
              第一种组合  1 2 4   
              第二种组合  12 4 
              第三种组合  1 24
          这个时候来了X
          X不能和4组合
          124X
              第一种组合 1 2 4 X
              第二种组合 12 4 X
              第二种组合 1 24 X  
          还是这三种,不能多一种,因为没法组合
          
          • 之前理解岔劈了,以为是每个元素,其实是组成这个的总体个数
    • 也就是说dp[3]以第三位结尾的前缀串 124 假设他的方案是 3种。那么第4位结尾,

  • 如果是1215, 第i位 5 可以选择单独翻译,也可以选择和前面一位组合翻译。

    • 分为两种情况了,组合与不组合
    • 也可以这么理解: dp[4] 可以由dp[3]推出 (不组合) 也可以由dp[2]推出(组合)
    • 那么dp[4] = dp[3]+dp[2]

初始化:dp[0]=1

为什么dp[0]=1 ?

  • 因为dp[1]=1 字符串只有1位的时候,肯定为1,那么dp[i]=dp[i-1] dp[0]必然为1
class Solution
{
    public int translateNum( int num )
    {
        char[] ch = String.valueOf(num).toCharArray();
        int len = ch.length;
        int[] dp = new int[len+1];
        dp[0]=1;
        dp[1]=1;

        for(int i=2 ;i<=len;i++)
        {
            // 把当前这一位和前面一位组合成数字, 因为ch数组是从0开始,因此当前位是i-1 前一位是i-2
            int n =(ch[i-2]-'0')*10 +(ch[i-1]-'0');
            // 能组合
            if(n>=10&&n<=25)
            {
                dp[i]=dp[i-1]+dp[i-2];
            }
            // 不能组合
            else
            {
                dp[i]=dp[i-1];
            }
        }
        return dp[len];
    }
}