動態規劃DP: 計算有幾個母音直線排列 Count Vowels Permutation_Leetcode #1220

閱讀時間約 4 分鐘

題目敘述

題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?

規則:

a 後面只能接e

e 後面只能接a 或 i

i 後面不能接 i (換句話說,接i之外的母音都可以)

o 後面只能接i 或 u

u 後面只能接a

最後回傳答案前,要求對10^9 + 7做除法取餘數。

詳細的題目可在這裡看到


測試範例

Example 1:

Input: n = 1
Output: 5
Explanation: All possible strings are: "a", "e", "i" , "o" and "u".

Example 2:

Input: n = 2
Output: 10
Explanation: All possible strings are: "ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou" and "ua".

Example 3: 

Input: n = 5
Output: 68

約束條件

Constraints:

  • 1 <= n <= 2 * 10^4

演算法

依照轉換規則,推導出對應的狀態轉移遞迴關係式:

a 後面只能接e

e 後面只能接a 或 i

i 後面不能接 i (換句話說,接i之外的母音都可以)

o 後面只能接i 或 u

u 後面只能接a


=> 推導出


a 後面只能接e

e 後面只能接a 或 i

i 後面只能接a, 或 e, 或 o, 或 u

o 後面只能接i 或 u

u 後面只能接a


=> 推導出


a結尾的字串來自 前一個e結尾的字串, 前一個i結尾的字串, 前一個u結尾的字串

e結尾的字串來自 前一個a結尾的字串, 前一個i結尾的字串

i結尾的字串來自 前一個e結尾的字串, 前一個o結尾的字串

o結尾的字串來自 前一個i結尾的字串

u結尾的字串來自 前一個i結尾的字串, 前一個o結尾的字串


初始條件: 一開始長度為一的方法數各有一種,分別是

a, e, i, o, u 本身,對應到字串長度1,1,1,1,1


造一個迴圈,從長度為2開始往上更新每個母音結尾的直線排列數。

最後,回傳答案前,記得對10^9 + 7做除法取餘數


程式碼

class Solution:
 def countVowelPermutation(self, n: int) -> int:
  
  modulo = 10**9 + 7
  
  # initialization for length of permutation = 1
  (a, e, i, o, u) = (1, 1, 1, 1, 1)
  
  length_of_permutation = 2
  while length_of_permutation <= n:
   
   # update total method count by transition rule
   end_with_a = e + i + u
 
   end_with_e = a + i

   end_with_i = e + o
  
   end_with_o = i

   end_with_u = i + o

# update method count of ending with a e i o u
   (a, e, i, o, u) = (end_with_a, end_with_e, end_with_i, end_with_o, end_with_u )
   
  
   length_of_permutation += 1
  

  return (a + e + i + o + u) % modulo



複雜度分析

時間複雜度:

O( n ) bottom-up 從 字串長度為1 開始遞迴更新到 字串長度為n。

空間複雜度:

O( 1 ) 使用到的都是臨時變數,所佔用記憶體空間為常數級別。


關鍵知識點

關鍵在於從題目給的字串規則推導每個母音結尾的遞迴狀態轉移關係式


Reference:

[1] Python O(1) aux space by DP. 70%+ [w/ Comment] - Count Vowels Permutation - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
動態規劃Dynamic Programming其實是 一種泛用的演算法思考方式與演算法建構框架。 動態規劃並不拘束於只能解課本上特定的的範例題。 只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算
Thumbnail
這期簡單從一間公司的財報結果,預期整個市場的未來漲跌。要怎麼做到呢?就讓我們進入做夢境瞧瞧囉
Thumbnail
題目敘述 題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種? 最後回傳答案之前,記得對109 + 7做除法取餘數。 詳細的題目可在這裡看到 數字鍵盤的配置如下圖 象棋的"馬"步 日字型走法 示意圖
Thumbnail
劉禹成,索雷博光電股份有限公司創辦人。憑藉對能源議題的興趣,創立索雷博光電,開展太陽能系統規劃安裝服務,除了為業主帶來穩定收入外,亦協助其樹立企業節能減碳的綠色形象,並以上市櫃為目標,期許在全球積極發展綠電的趨勢下,拓展業務至海外市場。
Thumbnail
从一个案例开始 动态规划 Hi, 你好。我是茶桁。 咱们之前的课程就给大家讲了什么是人工智能,也说了每个人的定义都不太一样。关于人工智能的不同观点和方法,其实是一个很复杂的领域,我们无法用一个或者两个概念确定什么是人工智能,无法具体化。 我也是要给大家讲两个重要的概念,要成为一个良好
Thumbnail
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
這時代很多人說要做自己,但會不會有一種可能是: 大多數人其實也不清楚自己想要成為怎麼樣的自己。 導致最後追逐的是其他人說服他的目標, 活在一種假象的追逐當中。 你想要成為的自己,是從你靈魂的聲音中,提煉出來的答案。 不是其他人的意見、不是從其他人那裏繼承的主張。
Thumbnail
適合自己的工作方向,是一種動態取捨的結果。開車開到一半,如果發現原本地圖上面的路中斷、或是想去其他目的地,那時候當然可以重新設定GPS系統,導航到另外一個地方。 如果什麼都會變,那還有所謂的長遠職涯規劃嗎?還是有的。長遠的職涯規劃不是某個點、某個職業、某個公司,是一個方向而不是單點。
Thumbnail
工作是自我的延伸,如果工作中的自己,不是自己想成為的模樣, 就會感到痛苦、掙扎,在抗拒中消耗所有的精力和意志, 回家之後只想躺在沙發上放空追劇,什麼進修計畫都放在一邊。 因為你已經在工作中費盡心力、偽裝了八小時的自己, 下班之後當然只想休息。 所以,不要再責備自己拖延不上進了,這其實是很正常的結果。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
動態規劃Dynamic Programming其實是 一種泛用的演算法思考方式與演算法建構框架。 動態規劃並不拘束於只能解課本上特定的的範例題。 只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算
Thumbnail
這期簡單從一間公司的財報結果,預期整個市場的未來漲跌。要怎麼做到呢?就讓我們進入做夢境瞧瞧囉
Thumbnail
題目敘述 題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種? 最後回傳答案之前,記得對109 + 7做除法取餘數。 詳細的題目可在這裡看到 數字鍵盤的配置如下圖 象棋的"馬"步 日字型走法 示意圖
Thumbnail
劉禹成,索雷博光電股份有限公司創辦人。憑藉對能源議題的興趣,創立索雷博光電,開展太陽能系統規劃安裝服務,除了為業主帶來穩定收入外,亦協助其樹立企業節能減碳的綠色形象,並以上市櫃為目標,期許在全球積極發展綠電的趨勢下,拓展業務至海外市場。
Thumbnail
从一个案例开始 动态规划 Hi, 你好。我是茶桁。 咱们之前的课程就给大家讲了什么是人工智能,也说了每个人的定义都不太一样。关于人工智能的不同观点和方法,其实是一个很复杂的领域,我们无法用一个或者两个概念确定什么是人工智能,无法具体化。 我也是要给大家讲两个重要的概念,要成为一个良好
Thumbnail
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
這時代很多人說要做自己,但會不會有一種可能是: 大多數人其實也不清楚自己想要成為怎麼樣的自己。 導致最後追逐的是其他人說服他的目標, 活在一種假象的追逐當中。 你想要成為的自己,是從你靈魂的聲音中,提煉出來的答案。 不是其他人的意見、不是從其他人那裏繼承的主張。
Thumbnail
適合自己的工作方向,是一種動態取捨的結果。開車開到一半,如果發現原本地圖上面的路中斷、或是想去其他目的地,那時候當然可以重新設定GPS系統,導航到另外一個地方。 如果什麼都會變,那還有所謂的長遠職涯規劃嗎?還是有的。長遠的職涯規劃不是某個點、某個職業、某個公司,是一個方向而不是單點。
Thumbnail
工作是自我的延伸,如果工作中的自己,不是自己想成為的模樣, 就會感到痛苦、掙扎,在抗拒中消耗所有的精力和意志, 回家之後只想躺在沙發上放空追劇,什麼進修計畫都放在一邊。 因為你已經在工作中費盡心力、偽裝了八小時的自己, 下班之後當然只想休息。 所以,不要再責備自己拖延不上進了,這其實是很正常的結果。