剑指 Offer 46. 把数字翻译成字符串

265 阅读1分钟

题目

image.png

思路:动态规划

  • dp[i]表示以arr[i]结尾的数字翻译出字符串的种数
  • 如果当前位能和前一位组成一个10-25的数字,则当前位有两种翻译方式,一种是单独,一种是两个一起。dp也就有两种来源
  • 类比跳台阶
  • 转移方程:dp[i] = dp[i - 1] + dp[i - 2]或者dp[i] = dp[i - 1];

0BE3ECED60C76EAB137CFF2FEB45424F.png

代码

class Solution {
    public int translateNum(int num) {
        String str = String.valueOf(num);
        int[] dp = new int[str.length()];
        //只有一位数
        dp[0] = 1;
        if (str.length() == 1) return dp[0];//否则下面substr越界
        //只有两位数
        int tmp = Integer.parseInt(str.substring(0, 2));
        if (tmp >= 10 && tmp <= 25) {//两种来源
            dp[1] = 2;
        } else {
            dp[1] = 1;
        }
        // 正常情况
        for (int i = 2; i < str.length(); i++) {
            tmp = Integer.parseInt(str.substring(i - 1, i + 1));//当前位和前一位组成的字符串
            if (tmp >= 10 && tmp <= 25) {//两种来源
                dp[i] = dp[i - 1] + dp[i - 2];
            } else {
                dp[i] = dp[i - 1];
            }
        }
        return dp[str.length() - 1];
    }
}