雙色球選購
阿新 • • 發佈:2020-12-25
技術標籤:LeetCode
LeetCode91. 解碼方法
題目描述:
一條包含字母
A-Z
的訊息通過以下方式進行了編碼:'A' -> 1 'B' -> 2 ... 'Z' -> 26
給定一個只包含數字的非空字串,請計算解碼方法的總數。
題目資料保證答案肯定是一個 32 位的整數。
示例:
輸入:s = “12”
輸出:2
解釋:它可以解碼為 “AB”(1 2)或者 “L”(12)。
分析:
狀態表示:f(i),所有由前i個數字解碼得到的字串
屬性:計算解碼得到的字串集合數量
集合劃分:最後一個字母由s[i]解碼;最後一個字母由s[i-1]和s[i]解碼
狀態轉移:
f ( x ) = f ( x − 1 ) + f ( x − 2 ) f(x)=f(x-1)+f(x-2) f(x)=f(x−1)+f(x−2)
當s[i]不是字元0時,才能由當前字元進行解碼;當s[i-1]s[i]所組成的數字在10到26之間時,才能由s[i-1]s[i]進行解碼
程式碼:
class Solution {
public int numDecodings(String s) {
int length = s.length();
// dp[i]表示所有由前i個數字解碼得到的字串
int[] dp = new int [length + 1];
// dp[0]表示由前0個數字解碼得到的字串,即空字串
dp[0] = 1;
for (int i = 1; i <= length; i++) {
//如果s[i]不是字元0,
if (s.charAt(i - 1) != '0') {
dp[i] += dp[i - 1];
}
// 當i大於等於2時,可以由兩位數字來進行解碼
if (i >= 2) {
int num = Integer.parseInt(String.valueOf(s.charAt(i - 2))) * 10 + Integer.parseInt(String.valueOf(s.charAt(i - 1)));
// 如果num在10到26之間,可以由兩位數字來進行解碼
if (num >= 10 && num <= 26) {
dp[i] += dp[i - 2];
}
}
}
return dp[length];
}
}