一條包含字母 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()]; } }