1. 程式人生 > 其它 >雙色球選購

雙色球選購

技術標籤: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(x1)+f(x2)
當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]; } }