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.
題意:如果從A到Z可以按1-26進行編碼,那么給出一串數字,有多少種解碼方式?
思路:
例如給出1221,如果從頭開始用深度搜索的方式找,對于每一位,都有可能有兩種解碼方法,時間復雜度將會非常高。
換一種角度,對于以每一位結尾的字符串來說,它的解碼方法和前面數字串解碼的方式相關,有點像jump那道題,可以用動態規劃的方法解決。
以dp[n]表示從頭到第n-1位有多少種解碼方法,如果當前位置n的數字是1-9,那么dp[n] += dp[n-1],如果n-1位不等于0并且和n位組合起來的數字小于等于26,dp[n] += dp[n-2]。dp[0]需要初始化為1,因為計算dp[2]時,如果前兩位組合是一個合法的編碼,將需要dp[0]。
public int numDecodings(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int len = s.length();
int[] dp = new int[len + 1];
dp[0] = 1;
dp[1] = s.charAt(0) != '0' ? 1 : 0;
for (int i = 2; i <= len; i++) {
if (s.charAt(i-1) != '0') {
dp[i] += dp[i-1];
}
if (s.charAt(i-2) != '0' && Integer.valueOf(s.substring(i-2, i)) <= 26) {
dp[i] += dp[i-2];
}
}
return dp[len];
}