【leetcode-91 動態規劃】 解碼方法

一條包含字母 A-Z 的消息經過如下方式進行了編碼:java

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

給定一個只包含數字的非空字符串,請計算解碼方法的總數。編碼

示例 1:spa

輸入: "12"
輸出: 2
解釋: 它能夠解碼爲 "AB"(1 2)或者 "L"(12)。

示例 2:code

輸入: "226"
輸出: 3
解釋: 它能夠解碼爲 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

 

 

注意,輸入100,輸出是0.題目未說明。本身寫的時候在這個地方犯錯。blog

 

很是相似於斐波那契序列,能夠理解爲dp[i]=dp[i-1]+dp[i-2]。可是這個是有條件的:若是以i爲結尾的字符串,最後兩位不在10-26之間,那麼dp[i-2]這一項就不能加,由於若是從i-2到i直接過分,須要一個10-26的兩位數。一樣的,若是最後一位爲0,那麼dp[i-1]這一項也不能夠加,由於從i-1過渡到i須要一個1-9的數。字符串

 

// dp[i]表示s[0~i-1]能夠有多少種解碼方式
// 遞推方程:若是1 <= s[i-1] <= 9,則dp[i] += dp[i-1]; 
// 若是10 <= s[i-2 ~ i-1] <= 26, 則dp[i] += dp[i-2].
連接:https://www.nowcoder.com/questionTerminal/a2539eb0a9ec4c54a055091e706072cc
來源:牛客網

import java.util.*;
public class Solution {
    public int numDecodings(String s) {
        if (s.length() == 0 || s.charAt(0) == '0') return 0; if (s.length() == 1) return 1; int f[] = new int[s.length() + 1];
        f[0] = 1; // 當有0個字符時候的編碼個數,當有連續兩個字符能編碼時f[i] = f[i-2],保證f[0]有值
        f[1] = 1; // 字符串長度爲1時的編碼個數
        for (int i = 1; i < s.length(); i++) {
            String num = s.substring(i - 1, i + 1);
            // 兩個字符可否拼成一個編碼
            if (Integer.valueOf(num) <= 26 && s.charAt(i - 1) != '0') {
                f[i + 1] = f[i + 1 - 2];
            } 
            // 單個字符可以構成編碼,若是含0,則不能編碼。
            f[i + 1] += s.charAt(i) != '0' ? f[i + 1 - 1] : 0;
        }
        return f[s.length()];
    }
}
相關文章
相關標籤/搜索