一魚多吃 用DP計算解碼的方法數 Decode Ways_Leetcode #91

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 6 分鐘

題目敘述

題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式?

要特別留意,輸入字串可能包含有leading zero,導致無法解碼

轉換規則如下:

A <-> 1

B <-> 2

C <-> 3

...

Z <-> 26


詳細的題目可在這裡看到


測試範例

Example 1:

Input: s = "12"
Output: 2
Explanation: "12" could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: s = "226"
Output: 3
Explanation: "226" could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

Example 3:

Input: s = "06"
Output: 0
Explanation: "06" cannot be mapped to "F" because of the leading zero ("6" is different from "06").

約束條件

Constraints:

  • 1 <= s.length <= 100
  • s contains only digits and may contain leading zero(s).

一樣,再次強調DP的解題框架,鞏固知識點。

Dynamic programming本質是透過遞迴關係式,去解決一個大規模的問題,而這個大規模的問題又可以被分解為較小規模的子問題,而且子問題往往彼此重複


Dynamic programming的解題框架可分為三大步驟

1. 定義狀態 [我在哪裡]

2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來]

3. 釐清初始狀態(也可以說是遞迴的終止條件) [第一步怎麼走,怎麼出發的]


1. 定義狀態 [我在哪裡]

這一題題目很明確要求,就是計算解碼的方法數。

我們可以令DP[ i ] 代表字串s[0] ~ s[i]的解碼總方法數。

那麼,題目所求就變成 DP[ n-1 ], where n = len(s) = 字串s的長度


2. 定義狀態轉移關係式(通則)
[我從哪裡來] => [答案從哪裡推導而來]

編碼寬度為2,1~26,有兩種可能的解碼途徑


第一種可能情況:

最後一個數字落在1~9之間,可以解碼最後一個數字。

DP[ i ] += DP[ i-1 ], if 1 <= int( s[i] ) <= 9


第二種可能情況:

最後兩個數字落在10~26之間,可以一口氣解碼最後兩個數字

DP[ i ] += DP[ i-2 ], if i >= 1 and 10 <= int( s[i-1 : i+1] ) <= 26:



3. 釐清初始狀態(終止條件)
[第一步怎麼走,怎麼出發的]

要特別留意,輸入字串可能包含有leading zero,導致無法解碼

所以當s[0] == "0"的時候,代表無法解碼,可以直接返回DP[0] = 0,不存在任何合法解碼方式。


另一方面,若s[0] != "0",代表存在唯一一種解碼方式,就是int(s[0])本身的數字,這時候DP[0] = 1。


最後,空字串 ""也只有一種解碼方式,就是空字串本身,DP[-1] = 1


程式碼

class Solution:
 def numDecodings(self, s):
  
  # Empty string, only one way to decode
  dp = {-1: 1}

  if s[0] != "0":
   dp[0] = 1
  else:
   # Leading zero, this string cannot be decoded.
   dp[0] = 0
   return 0
  
  def decode( i ):

   # look up DP table to avoid repeated computation
   if i in dp:
    return dp[i]

   count = 0

   # current digit is valid, try to decode prefix string without current digit
   if 1 <= int(s[i]) <= 9:
    count += decode(i-1)

   # current last two digits are valid, try to decode prefix string without current last two digits
   if i >= 1 and 10 <= int(s[i-1:i+1]) <= 26:
    count += decode(i-2)

   # update DP table
   dp[i] = count
   return count
  
  # ====================================
  return decode( len(s)-1 )

複雜度分析

時間複雜度:O(n)

其實仔細看,會發現每個index最多有兩條可行的分支,有點像是帶有條件的費式數列的變形DP[i] = DP[i-1] (如果最後一個數字可以解碼) + DP[i-2] (如果最後兩個數字可以解碼)


空間複雜度:O(n)

主要成本落在DP table: dp這個字典,還有decode()遞迴呼叫的最大深度,最深和字串長度len(s)一樣長。


Reference

[1] Python/JS/C++ O(n) by DP // Recursion [w/ Example] - Decode Ways - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
社群媒體世界「你掌握幾成?」 貼文總想一魚多吃…那經營失敗注定找上你這幾年在媒體社群上,著實下了不少功夫,說真的很多人都問說「臉書(Facebook)是不是真的要沒戲唱了?」其實我大多還是抱著比較樂觀的態度,如果你問身邊的年輕人,還用不用FB?那答案恐怕會讓你很心碎,一方面是自己的年紀已經不小,再者可能還會動搖你原本構思好的行銷計畫。 因此很多人在問我FB等等
Thumbnail
avatar
愛咪.C
2023-10-29
關於一主多奴-奴寵篇關於一主多奴,奴寵部份也該注意什麼? 要完全站在奴寵位置思考,還是有點難😅 1.妳能夠在理解之後,打心底接受這樣的關係嗎? 這邊說的接受,不是不停洗腦自己去接受這樣的關係,而是真的能夠接受這樣的關係,理解跟接受是兩回事。 2.妳曾想過想要怎樣的同伴嗎? 因為有時候,可能是妳和她相處的時間
avatar
可燃冰
2023-05-29
關於一主多奴-主人篇關於一主多奴,無論是主、奴哪方都需要注意的事項。 1.作為主人,你足夠坦誠嗎? 這邊指的坦誠,並不是指等你有了第一個奴一段時間,才突然坦承自己想要多收奴,而是一開始建立關係之前就必須告知讓奴方了解,這是義務,也是作為主人的責任。 在有第一位奴願意理解、接受之後,對後來遇到的第二位甚至往後幾位,
avatar
可燃冰
2023-05-29
一個人的成功不在於有多【聰明】而在於更能【熬】 很多的時候,大家都會認為一些成功者,都是很聰明的。【其實不然】。 阿里巴巴的創辦人馬雲,算是一位特別傳奇人物。 其中馬雲高中畢業,參加第一次高考(大學入學考試),大家應該不敢相信其中數學考了1分。
Thumbnail
avatar
Pedor Chang
2023-04-23
股票可以一魚多吃?股票可以一魚多吃? 可以,我們熟知的股票,主要是做價差或領股息,但是您知道,還可以做什麼用途嗎? 假如我們不要把股票賣掉,所以不做價差,那麼股票就可以做以下用途。
avatar
茉園生活隨筆
2022-12-20
【致親愛的你 系列】多留一點餘裕給自己和生活,這樣的人生才叫活過。說過上餘裕的生活,其實和「財富自由」沒有絕對關係⋯⋯時常覺得夢想和快樂是世上最快被放棄東西,無論是現實勒緊褲袋、或成就地位束縛,是說得頭頭是道卻毫無價值,總是第一個被捨棄⋯⋯
Thumbnail
avatar
陳然冉
2022-05-01
[台北旅遊]東明公園一座位於南港區重多機關要塞、台灣藍鵲賞鳥眾多場地精粹、社區小型森林之南港區特色公園台北市南港區東明公園相關資訊:: 地址: 台北市南港區南港路二段86巷8弄 (東明社會國宅旁邊) 電話: 02 2585 0192 (管理單位:台北市政府公園路燈工程管理處圓山管理所) 開放時間: 開放空間 (無時間限制) 備註: 公園 東明公園此地佔據在南港區眾多場地精粹之地 ​
Thumbnail
avatar
bravejim
2021-12-27
黃豆玉米多空懸於一線| 原物料觀察日記 美國農業部將於10/12公佈供需報告,從產量、期末庫存到單產,幾項重要指標皆普遍被預期會較前次調高。 產量:從4374百萬英斗上調至4415百萬英斗(區間4374- 4466百萬英斗) 期末庫存:從1850百萬英斗上調至3000百萬英斗(區間1610- 3730百萬英斗)
Thumbnail
avatar
諸葛呆的耕讀筆記- 外匯、經濟、黃小玉
2021-10-11
114號記錄:考思辨 你看得出論文原稿一魚多吃的問題嗎?童文薰律師在童溫層節目中整理出蔡英文一魚多吃的記錄 我其實蠻意外,在童文薰律師揭露蔡英文論文原稿一魚多吃之後,御用媒體會真的當回事發報導洗白的;因為這真的不是一般人會關心的事。但《芋傳媒》還真的引用了一個臉書粉專:《翻譯有要緊》的貼文煞有介事的這麼做了。
Thumbnail
avatar
台灣星火
2021-09-30
113號記錄:消失的一魚多吃期刊蔡英文的國圖版論文公佈之後,除了抄襲爭議外的另一個質疑,就是童文薰律師揭露的一魚多吃。而其中有趣的一則花絮就是...
Thumbnail
avatar
台灣星火
2021-09-30