LeetCode 91 解碼方法

2021-08-21 19:31:43 字數 1356 閱讀 5747

一條包含字母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), 或者 "bbf" (2 2 6) 。

動規首先就是要分解子問題嘛

首先捏,從巨集觀上來看,先不管各種限制,進行如下分析:

字串長度為1時,假設字串是「1」,f(1)= 1;

字串長度為2時,假設字串是「12」,f(2)= 2;情況有:(1,2)(12)

字串長度為3時,假設字串是「123」,f(3)= f(2) + f(1);

為什麼是這樣呢?

情況一:「3」 和 「12」的情況,「12」的種類正是f(2)

情況二:「23」 與 「1」的情況,「1」的種類正是f(1)

有些人就奇怪,為什麼不算」23「的種類,來看一下」23「可以分成(2,3)和(23),但是」2,3「這種情況在情況一中已有體現(情況一已把3單獨拆開),情況二這裡再算的話就會有重複。

以此類推,f(n) = f(n - 1) + f(n -2 );

接下來看到細節:

分析情況一:解碼方法數為:最後乙個數字提取出來,這個數字之前的字串的解碼方法數。

提取數字前的字串解碼方法數f(n - 1)不多bb,分析一下提取出來的數字。

根據題意可知(1~26)表示a~z,其中單個數字範圍就是1~9了

所以可知提取出來的數字是0時,情況一為0,否則才是f(n - 1);

分析情況二:解碼方法數為:最後兩個數字提取出來,這倆數字之前的字串的解碼方法數。

提取數字前的字串解碼方法數f(n - 2)不多bb,分析一下提取出來的倆數字。

根據題意可知(1~26)表示a~z,其中單個數字範圍就是10~27了

所以大於27或小於10情況二直接為0,否則是f(n - 2);

**如下:

public int numdecodings(string s) 

return ints[ints.length - 1];

}

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 或者 bbf...

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 或...