↓快轉到主要內容
  1. LeetCode/

LeetCode 1220: Count Vowels Permutation

·1 分鐘· ·
LeetCode Hard Dynamic-Programming State-Machine
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: hard 第一次嘗試:2026-10-15

  • 提交紀錄:Wrong Answer ×2 → Accepted

解題思路
#

狀態是「最後一個母音」,a, e, i, o, u 分別代表以它結尾的字串數。題目給的是「x 後面只能接誰」,寫成轉移時要反過來看「x 前面可以是誰」:

結尾前一個可以是
ae、i、u
ea、i
ie、o
oi
ui、o

長度 1 時每個都是 1,跑 n - 1 次轉移。

我的嘗試
#

  1. 第一版:模數寫成 10 % 9 + 7(等於 8),應該是 10 ** 9 + 7;最後的加總也沒取模。例如 n = 5:答案是 68,回傳 20。
  2. 第二版:補上最後的取模,但模數還是 8。例如 n = 2:答案是 10,回傳 10 % 8 = 2。
  3. 改成 10 ** 9 + 7 就 AC 了。

正確解法
#

class Solution:
    def countVowelPermutation(self, n: int) -> int:
        MOD = 10 ** 9 + 7
        a = e = i = o = u = 1
        for _ in range(n - 1):
            a, e, i, o, u = (
                (e + i + u) % MOD,                 # 前一個可以是 e、i、u
                (a + i) % MOD,
                (e + o) % MOD,
                i % MOD,
                (i + o) % MOD,
            )
        return (a + e + i + o + u) % MOD

用同時賦值就不用另外存 prev_a 這些變數。

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 10 % 9 + 7 跟 10 ** 9 + 7 只差一個字元,小測資會過、大測資才錯。
  • 規則是「x 後面接誰」,轉移要反過來寫。

面試口說整理
#

狀態是最後一個母音,五個變數分別代表以它結尾的字串數。題目給的是誰後面能接誰,我把它反過來,算每個母音前面可以是誰,每一步同時更新五個值,最後加總取模。時間 O(n)。

相關文章

LeetCode 2912: Number of Ways to Reach Destination in the Grid
·2 分鐘
LeetCode Hard Dynamic-Programming State-Machine Math Combinatorics
LeetCode 2912 解題筆記:格子太多,但相對終點只分四類:終點、同一列、同一行、都不同;每一類的總方法數一起轉移,O(k)
LeetCode 1411: Number of Ways to Paint N × 3 Grid
·1 分鐘
LeetCode Hard Dynamic-Programming State-Machine Graph-Coloring
LeetCode 1411 解題筆記:一列的塗法只分兩種樣式:ABA(兩端同色)和 ABC(三色不同),各 6 種;下一列 ABA → 3 ABA + 2 ABC、ABC → 2 ABA + 2 ABC
LeetCode 1320: Minimum Distance to Type a Word Using Two Fingers
·1 分鐘
LeetCode Hard Dynamic-Programming State-Machine String
LeetCode 1320 解題筆記:打完 word[i] 時,一定有一根手指在 word[i] 上,狀態只要記另一根手指在哪;dp[other] 是另一根手指在 other 的最小距離
LeetCode 552: Student Attendance Record II
·2 分鐘
LeetCode Hard Dynamic-Programming State-Machine
LeetCode 552 解題筆記:狀態機 DP,狀態是「A 用了幾次 × 結尾連續幾個 L」共 6 種;每天選 P、A、L 決定下一個狀態
LeetCode 123: Best Time to Buy and Sell Stock III
·3 分鐘
LeetCode Hard Dynamic-Programming State-Machine
LeetCode 123 解題筆記,依照原始 learning note 重新整理
LeetCode 188: Best Time to Buy and Sell Stock IV
·3 分鐘
LeetCode Hard Dynamic-Programming State-Machine
LeetCode 188 解題筆記,依照原始 learning note 重新整理