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

更新於 2024/10/29閱讀時間約 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
90會員
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
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
或許有些人會有疑問:輔音必須與元音結合才能夠說,例如華語「ㄅ」需要和「ㄚ」結合才會形成完整的音節「ㄅㄚ」。但是細心的讀者可能會問華語的「ㄓ」或「ㄗ」為什麼可以獨立存在呢?
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
藉由是非題的回答情況來反推答案與分數
Thumbnail
上次我提到初學者的五個障礙其中三個,我先小結一下解法:第一個是五十音:鍥而不捨、唯勤是岸
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
或許有些人會有疑問:輔音必須與元音結合才能夠說,例如華語「ㄅ」需要和「ㄚ」結合才會形成完整的音節「ㄅㄚ」。但是細心的讀者可能會問華語的「ㄓ」或「ㄗ」為什麼可以獨立存在呢?
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
藉由是非題的回答情況來反推答案與分數
Thumbnail
上次我提到初學者的五個障礙其中三個,我先小結一下解法:第一個是五十音:鍥而不捨、唯勤是岸
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更