動態規劃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

83會員
421內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
這題算是路徑計數類的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
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
从一个案例开始 动态规划 Hi, 你好。我是茶桁。 咱们之前的课程就给大家讲了什么是人工智能,也说了每个人的定义都不太一样。关于人工智能的不同观点和方法,其实是一个很复杂的领域,我们无法用一个或者两个概念确定什么是人工智能,无法具体化。 我也是要给大家讲两个重要的概念,要成为一个良好
Thumbnail
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
這時代很多人說要做自己,但會不會有一種可能是: 大多數人其實也不清楚自己想要成為怎麼樣的自己。 導致最後追逐的是其他人說服他的目標, 活在一種假象的追逐當中。 你想要成為的自己,是從你靈魂的聲音中,提煉出來的答案。 不是其他人的意見、不是從其他人那裏繼承的主張。
Thumbnail
適合自己的工作方向,是一種動態取捨的結果。開車開到一半,如果發現原本地圖上面的路中斷、或是想去其他目的地,那時候當然可以重新設定GPS系統,導航到另外一個地方。 如果什麼都會變,那還有所謂的長遠職涯規劃嗎?還是有的。長遠的職涯規劃不是某個點、某個職業、某個公司,是一個方向而不是單點。
Thumbnail
工作是自我的延伸,如果工作中的自己,不是自己想成為的模樣, 就會感到痛苦、掙扎,在抗拒中消耗所有的精力和意志, 回家之後只想躺在沙發上放空追劇,什麼進修計畫都放在一邊。 因為你已經在工作中費盡心力、偽裝了八小時的自己, 下班之後當然只想休息。 所以,不要再責備自己拖延不上進了,這其實是很正常的結果。
Thumbnail
Meta Advantage 測試中,整合自動化廣告產品,導入機器學習、智慧投放;回到最初!Instagram 動態貼文將照時間排序、開放美國所有用戶標註商品;Netflix 宣布收購遊戲開發商,積極進軍手遊市場、YouTube 強化 AVOD 服務,用戶可免費收看 4000+ 影劇內容。
Thumbnail
台灣瑞歐每週定期更新全球法規動態,讓您輕鬆掌握最新合規資訊。
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
从一个案例开始 动态规划 Hi, 你好。我是茶桁。 咱们之前的课程就给大家讲了什么是人工智能,也说了每个人的定义都不太一样。关于人工智能的不同观点和方法,其实是一个很复杂的领域,我们无法用一个或者两个概念确定什么是人工智能,无法具体化。 我也是要给大家讲两个重要的概念,要成为一个良好
Thumbnail
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
這時代很多人說要做自己,但會不會有一種可能是: 大多數人其實也不清楚自己想要成為怎麼樣的自己。 導致最後追逐的是其他人說服他的目標, 活在一種假象的追逐當中。 你想要成為的自己,是從你靈魂的聲音中,提煉出來的答案。 不是其他人的意見、不是從其他人那裏繼承的主張。
Thumbnail
適合自己的工作方向,是一種動態取捨的結果。開車開到一半,如果發現原本地圖上面的路中斷、或是想去其他目的地,那時候當然可以重新設定GPS系統,導航到另外一個地方。 如果什麼都會變,那還有所謂的長遠職涯規劃嗎?還是有的。長遠的職涯規劃不是某個點、某個職業、某個公司,是一個方向而不是單點。
Thumbnail
工作是自我的延伸,如果工作中的自己,不是自己想成為的模樣, 就會感到痛苦、掙扎,在抗拒中消耗所有的精力和意志, 回家之後只想躺在沙發上放空追劇,什麼進修計畫都放在一邊。 因為你已經在工作中費盡心力、偽裝了八小時的自己, 下班之後當然只想休息。 所以,不要再責備自己拖延不上進了,這其實是很正常的結果。
Thumbnail
Meta Advantage 測試中,整合自動化廣告產品,導入機器學習、智慧投放;回到最初!Instagram 動態貼文將照時間排序、開放美國所有用戶標註商品;Netflix 宣布收購遊戲開發商,積極進軍手遊市場、YouTube 強化 AVOD 服務,用戶可免費收看 4000+ 影劇內容。
Thumbnail
台灣瑞歐每週定期更新全球法規動態,讓您輕鬆掌握最新合規資訊。