1. 程式人生 > 實用技巧 >leetcode 劍指 Offer 46. 把數字翻譯成字串

leetcode 劍指 Offer 46. 把數字翻譯成字串

劍指 Offer 46. 把數字翻譯成字串

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

示例 1:

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

提示:

0 <= num < 231

思路

有點像青蛙跳臺階的題目,每次向前前進一格,或者向前前進兩格,最後中跳上n個臺階的一共的方式種數有dp[n]=dp[n-1]+dp[n-2] 一次跳2格是有條件的,就是前後兩各數字組成的2位數必須在[10,25]之間 所以狀態轉移方程為dp=dp[n-1]當XnXn-1不在[10,25]區間時 dp=dp[n-1]+dp[n-2],當XnXn-1在[10,25]區間時
 1
class Solution { 2 public int translateNum(int num) { 3 4 // 為方便索引,把num轉換成字串 5 String str = String.valueOf(num); 6 int len = str.length(); 7 int[] dp = new int[len+1]; 8 9 dp[0] = 1; 10 dp[1] = 1; 11 for(int i = 2; i <= len; i++){
12 String tmp = str.substring(i-2, i); 13 if(tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0){ 14 dp[i] = dp[i-1] + dp[i-2]; 15 }else{ 16 dp[i] = dp[i-1]; 17 } 18 } 19 return dp[len]; 20 }
21 }

leetcode執行用時:0 ms > 100.00%, 記憶體消耗:35.8 MB > 8.40%

複雜度分析:

時間複雜度:把數字num的每一位都遍歷了一遍,所以時間複雜度為O(n)

空間複雜度:把數字轉換成了字串,需要一個O(n)的空間,另外還需要一個dp陣列,所以一共需要O(2n)的空間

改進-空間優化

發現其實每個dp[i]只和dp[i-1] 和 dp[i-2]有關,所以只需要兩個區域性變數不斷迭代即可,可以省去dp陣列的空間複雜度

 1 class Solution {
 2     public int translateNum(int num) {
 3         
 4         // 為方便索引,把num轉換成字串
 5         String str = String.valueOf(num);
 6         int len = str.length();
 7         // int[] dp = new int[len+1];
 8 
 9         int a = 1;
10         int b = 1;
11         int res = 0;
12         for(int i = 2; i <= len; i++){
13             String tmp = str.substring(i-2, i);
14             if(tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0){
15                 res = a + b;
16             }else{
17                 res = a;
18             }
19             b = a;
20             a = res;
21         }
22         return a;
23     }
24 }

leetcode執行用時:0 ms > 100.00%, 記憶體消耗:35.6 MB > 55.83%

複雜度分析:

時間複雜度:把數字num的每一位都遍歷了一遍,所以時間複雜度為O(n)

空間複雜度:把數字轉換成了字串,需要一個O(n)的空間,所以一共需要O(n)的空間