leetcode 劍指 Offer 46. 把數字翻譯成字串
阿新 • • 發佈:2020-10-04
劍指 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]區間時1class 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)的空間