2020/3/17 打卡
一條包含字母 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.我們知道最後乙個字母有可能是由乙個數字串或兩個數字串轉化而來,例如'12312'這個數字串,轉化成字母串最後一位可以是'2'轉成b,也可能是'12'轉成l
2.設數字串s的前i個數字解密成字母串有dp[i]種方式:那麼就有dp[i] = dp[i-1] + dp[i-2]
dp[i-1]表示最後乙個數字解密成乙個字母
dp[i-2]表示最後兩個數字解密成乙個字母
3.由於這裡存在很多特殊情況:
例如dp[i-2]表示最後兩個數字解密成乙個字母的情況必須要至少有兩個數字
例如最後兩個字母大於26,像55、01等是不存在dp[i-2]這種情況的
所以,像下面的拆開寫狀態轉移方程,分別判斷是很好的思路,見**。
def dp_fun(s):
size=len(s)
# 邊界條件
if size==0:
return 0
#建立 狀態,表示 到當前位置,可以有的解碼方法總數
dp=[0]*(size+1)
# 狀態初始化
dp[0]=1
# 進行狀態轉移操作
for i in range(1,size+1):
#—————————— 接下來對於每個位置,都做了 dp[i] = dp[i-1] + dp[i-2]組合的相加 ——————————————————
t = int(s[i - 1])
# 最後乙個數字解密成乙個字母。 先加上 前乙個包裝成dp[i-1]的情況。
if t >= 1 and t <= 9:
dp[i] += dp[i - 1]
# 下面這種情況至少要有兩個字元。 再加上 前兩個可以包裝成dp[i-2]的情況(需要組合數在 0-26範圍內。)。
if i >= 2:
t = int(s[i - 2]) * 10 + int(s[i - 1])
if t >= 10 and t <= 26:
# 最後兩個數字解密成乙個字母
dp[i] += dp[i - 2]
# 最後乙個位置上的統計 ,就是整體對整個字串的 編碼方法總數上的統計。
return dp[-1]
leetcode 面試題108 解碼方法
2020 3 18 打卡 將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二...
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 或者 ...