題目:
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
,
it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
題解:
動態規劃來做。
設定動態陣列dp[n+1]。dp[i]表示從1~i的decode ways的個數。
當給的code只有一位數時,判斷是不是valid(A~Z),是的話就dp[1] = 1 不是的話就是dp[1] = 0
因為像給的例子12可以有兩種可能的解析方法,所以計算dp[i]的時候要判斷兩種可能性,再累加。
程式碼如下:
1 public int numDecodings(String s) {
2 if (s.length()==0||s==null||s=="0")
3 return 0;
4
5 int[] dp = new int[s.length()+1];
6 dp[0] = 1;
7
8 if (isValid(s.substring(0,1)))
9 dp[1] = 1;
10 else
11 dp[1] = 0;
12
13 for(int i=2; i<=s.length();i++){
14 if (isValid(s.substring(i-1,i)))
15 dp[i] += dp[i-1];
16 if (isValid(s.substring(i-2,i)))
17 dp[i] += dp[i-2];
18 }
19 return dp[s.length()];
20 }
21
22 public boolean isValid(String s){
23 if (s.charAt(0)=='0')
24 return false;
25 int code = Integer.parseInt(s);
26 return code>=1 && code<=26;
27 }
2 if (s.length()==0||s==null||s=="0")
3 return 0;
4
5 int[] dp = new int[s.length()+1];
6 dp[0] = 1;
7
8 if (isValid(s.substring(0,1)))
9 dp[1] = 1;
10 else
11 dp[1] = 0;
12
13 for(int i=2; i<=s.length();i++){
14 if (isValid(s.substring(i-1,i)))
15 dp[i] += dp[i-1];
16 if (isValid(s.substring(i-2,i)))
17 dp[i] += dp[i-2];
18 }
19 return dp[s.length()];
20 }
21
22 public boolean isValid(String s){
23 if (s.charAt(0)=='0')
24 return false;
25 int code = Integer.parseInt(s);
26 return code>=1 && code<=26;
27 }
Reference:
http://blog.csdn.net/u011095253/article/details/9248109