leetcode面試題46把數字翻譯成字符串

題目鏈接:數字翻譯成字符串
題目描述:
給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。

示例 1:

輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

題目分析:和之前的打家劫舍有些相似。由於題目最大數字爲25,是一個兩位數,那麼將數字進行拆分求解組合時“
如果是一位數,沒有任何限制,但是如果是一個兩位數,就需要判斷是否是一個合法的數字,合法才能算爲一個方案,不難看出,合法的範圍爲[10-25],此外,0X的形式也是不合法的。
我們用dp[i]表示到數字i爲止的方案數目,如果i與i-1的組成的兩位數是合法的,方案累加,否則仍舊繼承i-1的方案數
在這裏插入圖片描述

代碼:

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

優化:一維的遞推數組我們可以使用臨時變量的方法來進行空間優化

class Solution {
    public int translateNum(int num) {
        String s = String.valueOf(num);
        int n = s.length();
        int a = 1,b = 1,c = 0;
        for(int i = 2;i <= n;i++){
          String te = s.substring(i-2,i);
            c = te.compareTo("10") >= 0 && te.compareTo("25") <= 0 ? a + b : a;
            b = a;
            a = c;

        }
        return a;
    }
}

更進一步,我們還可以把字符串s去掉,直接在num上進行處理,對某個數值要取得特定位數的數字,一般通過
對10的冪做整除與取餘運算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章