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

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

  • 题目描述
  • 解题思路
  • 代码

题目描述

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

0 <= num < 231

解题思路

现将数字转化成为字符串,方便对这个数的每一位进行访问。

[0,9]的数字,有且最多只有一种翻译,一旦大于9的情况,比如10就可以翻译成为bah,遍历到这个数字字符串的每一位,要求当前位之前数字的最大翻译方式,就可以使用动态规划的思路进行解决,由于翻译过来,最多是z也就是数字对应的25,所以最多只需要看两位就行。

定义动态规划的数组dp,其中dp[i]用于表示i,当前位置的翻译次数最少是上一次的翻译次数。

初始化可以是dp[0]dp[1]都是1,转移方程是dp[i+1] = dp[i] + dp[i-1]

代码

使用动态规划的数组,空间复杂度线性阶,依赖于数字的长度

    public int translateNum(int num) {
        String s = String.valueOf(num);
        int n = s.length();
        if(n < 2) return n;
        // dp[i]表示的是i位置的翻译的可能
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        // 此时的 抵达n-1时候,最多可以计算到dp[n]
        for(int i = 1; i < n; i++){
            dp[i+1] = dp[i];
            int curNum = 10 * (s.charAt(i-1) - '0') + (s.charAt(i) - '0');
            // a - 0,z - 25
            if(curNum > 9 && curNum < 26){
                dp[i+1] = dp[i] + dp[i-1];
            }
        }
        return dp[n];
    }

使用变量代替动态规划数组,空间复杂度常数阶

	public int translateNum(int num) {
        String s = String.valueOf(num);
        int length = s.length();
        if(length < 2) return length;
        int a = 1,b = 1,c = 0;
        for(int i = 1; i < length; i++){
            c = b;
            int currentNum = 10 * (s.charAt(i-1) - '0') + (s.charAt(i) - '0');
            if(currentNum > 9 && currentNum < 26){
                c = a + b;
            }
            a = b;
            b = c;
        }
        return c;
    }

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)