LeetCode 091 解碼方法

2021-10-14 09:31:16 字數 1455 閱讀 8180

一條包含字母 a-z 的訊息通過以下對映進行了 編碼 :

『a』 -> 1

『b』 -> 2

…『z』 -> 26

要 解碼 已編碼的訊息,所有數字必須基於上述對映的方法,反向對映回字母(可能有多種方法)。例如,「111」 可以將 「1」 中的每個 「1」 對映為 「a」 ,從而得到 「aaa」 ,或者可以將 「11」 和 「1」(分別為 「k」 和 「a」 )對映為 「ka」 。注意,「06」 不能對映為 「f」 ,因為 「6」 和 「06」 不同。

給你乙個只含數字的 非空 字串 num ,請計算並返回 解碼 方法的 總數 。

題目資料保證答案肯定是乙個 32 位 的整數。

示例 1:

輸入:s = 「12」

輸出:2

解釋:它可以解碼為 「ab」(1 2)或者 「l」(12)。

示例 2:

輸入:s = 「226」

輸出:3

解釋:它可以解碼為 「bz」 (2 26), 「vf」 (22 6), 或者 「bbf」 (2 2 6) 。

用動態規劃

dp陣列記錄解碼方法種數

dp[i]表示s前i個字元的解碼方法種數

dp[i] = dp[i - 1]s[i]不為'0'此時保證該位置字元可以單獨解碼

dp[i] += dp[i - 2]10 * s[i - 1] + s[i][10, 26]區間內,此時證明該位置與前乙個位置的字元可以一起解碼

注意:如果第乙個是'0'則直接返回0

class

solution

// dp[i] 表示s前i個字元的解碼方法種數

// dp[i] = dp[i - 1] 當s[i]不為'0'

// dp[i] += dp[i - 2] 當 10 * s[i - 1] + s[i] 在[10, 26]區間內

int[

] dp =

newint

[length]

;char

chars = s.

tochararray()

;if(chars[0]

=='0'

) dp[0]

=1;for

(int i =

1; i < length; i++

)int num =10*

(chars[i -1]

-'0')+

(cur -

'0');if

(10<= num && num <=26)

else}}

return dp[length -1]

;}}

LeetCode 解碼方法

q 一條僅包含字母 a z 的訊息用下列的方式加密成數字 a 1 b 2 z 26 現在給出加密成數字的密文,請判斷有多少種解密的方法 例如 給出的密文為 12 可以解密為 ab 1 2 或者 l 12 所以密文 12 的解密方法是2種.a 分兩種情況。當前位置 s i 1 9 當前位置可單獨作為乙...

LeetCode91 解碼方法

這題,我花了好大的功夫才通過,中途踩了很多坑,從這個15頂25踩,通過率只有10 多,就能看出這個題,雖然是乙個中等難度的題,但是並沒有那麼好做。看到題目,感覺有點像爬樓梯的那個?想到用動態規劃。第一次寫 沒有考慮0的情況,出錯,那麼就考慮吧,如果出現在頭,就返回0,出現的中間的話。不過我是從後往前...

LeetCode 91 解碼方法

一條包含字母a z的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3 解釋 它可以解碼為 bz 2 26 vf 22 6 或者 ...