題目連結:
題目意譯:
給定一整數 n,你的任務是計算有多少長度 n 的字串可由以下規則而形成:
每個字元為小寫母音字母('a' 、 'e' 、 'i' 、 'o' 、 'u')
每個母音 'a' 隨後只能接著一個 'e'。
每個母音 'e' 隨後只能接著一個 'a' 或是 'i'。
每個母音 'i' 隨後不得接著另一個 'i'。
每個母音 'o' 隨後只能接著一個 'i' 或是 'u'。
每個母音 'u' 隨後只能接著一個 'a'。
由於答案可能很大,將其模 10 ^ 9 + 7 後回傳。
限制:
1 ≦ n ≦ 2 × 10 ^ 4
範例測資:
範例 1:
輸入: n = 1
輸出: 5
解釋: 所有可能的字串為: "a" 、 "e" 、 "i" 、 "o" 和 "u"。
範例 2:
輸入: n = 2
輸出: 10
解釋: 所有可能的字串為: "ae" 、 "ea" 、 "ei" 、 "ia" 、 "ie" 、 "io" 、 "iu" 、 "oi" 、 "ou" 和 "ua"。
範例 3:
輸入: n = 5
輸出: 68
解題思維:
動態規劃(Dynamic Programming)之題型,且我們可以按照類似
這題的邏輯——定義一個二維陣列 D,其中 D[i][j] 代表長度為 i 且以 a 、 e 、 i 、 o 、 u(依序對應為 j = 0 、 1 、 2 、 3 、 4)結尾的字串數量。
而根據題意我們可以看到
a 接著 e 代表著:
DP[i][0] = DP[i-1][1]
e 接著 a 或 i 代表著:
DP[i][1] = DP[i-1][0] + DP[i-1][2]
i 不得接另一個 i 代表著:
DP[i][2] = DP[i-1][0] + DP[i-1][1] + DP[i-1][3] + DP[i-1][4]
o 接 i 或 u 代表著:
DP[i][3] = DP[i-1][2] + DP[i-1][4]
u 接 a 代表著:
DP[i][4] = DP[i-1][0]
且我們可以看到 D[1][0] = D[1][1] = D[1][2] = D[1][3] = D[1][4] = 1,因為單一個母音字母即是合法的字串。而我們的所求將會是
D[n][0] + D[n][1] + D[n][2] + D[n][3] + D[n][4]
不過記得計算的過程要取除以 10 ^ 9 + 7 的餘數,以免溢位。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。