📌  相关文章
📜  排列单词以使元音不一起出现的方式数量(1)

📅  最后修改于: 2023-12-03 15:25:55.508000             🧑  作者: Mango

排列单词以使元音不一起出现的方式数量

介绍

本程序可以计算给定长度的字符串中,如何排列单词以使元音不一起出现的方式数量。元音指字母 A、E、I、O、U(不区分大小写)。

该问题可以用动态规划算法解决。具体地,设 $dp[i][j]$ 为长度为 $i$ 且以第 $j$ 个字母结尾的字符串中,元音字母不连续的排列方式数量。则可以得到转移方程:

$$ \begin{aligned} dp[i][1] &= 1 \ dp[i][j] &= \sum_{k \in {1, 2, 3, 4, 5} \setminus {\text{前一个字母}}} dp[i-1][k] \end{aligned} $$

最终答案即为 $\sum_{i=1}^n dp[n][i]$。

函数签名
def count_vowel_permutations(n: int) -> int:
    pass
  • 参数:
    • n:正整数,表示字符串长度。
  • 返回值:
    • 整数,表示排列单词以使元音不一起出现的方式数量。
示例
>>> count_vowel_permutations(1)
5
>>> count_vowel_permutations(2)
10
>>> count_vowel_permutations(5)
68
实现

下面给出 Python 的实现代码。

def count_vowel_permutations(n: int) -> int:
    MOD = 10 ** 9 + 7
    dp = [[0] * 6 for _ in range(n+1)]
    for i in range(1, 6):
        dp[1][i] = 1
    for i in range(2, n+1):
        dp[i][1] = sum(dp[i-1][2:])
        dp[i][2] = sum(dp[i-1][1:3] + dp[i-1][4:])
        dp[i][3] = sum(dp[i-1][:3] + dp[i-1][4:])
        dp[i][4] = sum(dp[i-1][:4])
        dp[i][5] = sum(dp[i-1][1:])
    return sum(dp[n]) % MOD
参考文献