程序媛詹妮弗
终身学习

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

 

思路:

解法一:recursion, 找到全部可能的解密方法(会TLE)

time :  O(2 ^ n) 因为是一个二叉树, 其高度最高为n,  所以时间复杂度是O(2 ^ n)

space: O(n)   跟数的高度有关,就是n层

 1 public int numDecodings(String s ){
 2     if(s == null || s.length() == 0) retrun 0;
 3     return numDecodings(s.toCharArray(), 0);
 4 }
 5 
 6 private int numDecodings(char[] array, int level){
 7     if(level == array.length){return 1;}
 8     int ways = 0;
 9     if(array[level] != ‘0’) {
10         ways += numDecodings(array, level + 1);
11   }
12   if(validEncoding(array, level)){
13       ways += numDecodings(array, level + 2);
14   }
15     return ways;
16 }
17 
18 private boolean validEncoding(char[]array, int start){
19     if(start + 1 >= array.length) return false;
20     if(array[start] = ‘1’) return true;
21     if(array[start] == ‘2’ && array[start + 1] –‘6’ <=0) return true;
22     return false;
23 }

 

解法二:自顶向下记忆化搜索(recursion + memorization)

time :  O(1) * (n + 1 )  = O(n)

space: O(n)

 1 class Solution {
 2       public int numDecodings(String s ){
 3         if(s == null || s.length() == 0) return 0;
 4         int[] m = new int[s.length() + 1];
 5         Arrays.fill(m, -1);
 6         return numDecodings(s.toCharArray(), 0, m);
 7     }
 8 
 9     private int numDecodings(char[] array, int level, int[] m){
10         if(m[level] != -1){
11             return m[level];
12         }
13         if(level == array.length){
14             m[level] = 1;
15             return 1;
16         }
17         int ways = 0;
18         if(array[level] != '0') {
19             ways += numDecodings(array, level + 1, m);
20         }
21         if(validEncoding(array, level)){
22             ways += numDecodings(array, level + 2, m);
23         }
24         return ways;
25     }
26 
27     private boolean validEncoding(char[]array, int start){
28         if(start + 1 >= array.length) return false;
29         if(array[start] == '1') return true;
30         if( array[start] == '2' && array[start + 1] - '6' <= 0 ){
31             return true;
32         }
33         return false;
34     }
35 }

 

解法三: 自底向上的dp

 1 class Solution {
 2      public int numDecodings(String s) {
 3         if (s == null || s.length() == 0) return 0;
 4         int len = s.length();
 5         int[] dp = new int[len + 1];
 6         dp[0] = 1;
 7         dp[1] = s.charAt(0) == '0' ? 0 : 1;
 8         for (int i = 2; i <= len; i++) {
 9             int first = Integer.parseInt(s.substring(i - 1, i));
10             int second = Integer.parseInt(s.substring(i - 2, i));
11             if (first >= 1 && first <= 9) {
12                 dp[i] += dp[i - 1];
13             }
14             if (second >= 10 && second <= 26) {
15                 dp[i] += dp[i - 2];
16             }
17         }
18         return dp[len];
19     }
20 }

 

 

 

posted on 2018-05-22 06:33  程序媛詹妮弗  阅读(156)  评论(0编辑  收藏  举报