Python|Leetcode《1220》|统计元音字母序列的数目

简介: Python|Leetcode《1220》|统计元音字母序列的数目

一、题目描述

题目:统计元音字母序列的数目

难度:困难

地址:《统计元音字母序列的数目》

描述:给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串:

字符串中的每个字符都应当是小写元音字母('a', 'e', 'i', 'o', 'u'


每个元音'a'后面都只能跟着'e'

每个元音'e'后面只能跟着'a'或者是'i'

每个元音'i'后面 不能 再跟着另一个'i'

每个元音'o'后面只能跟着'i'或者是'u'

每个元音'u'后面只能跟着'a'

由于答案可能会很大,所以请你返回 模 10^9 + 7 之后的结果。


示例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


提示:image.png


image.png

 

二、题目解析

此题虽为难题,但是本质上可以看作是动态规划问题的一般形态。


初始形态为字符串长度为1的时候的形态(n=1),后续随着n的增大,我们不断的替换每一层的字符中有几个a、e、i、o、u即可,例如第二层的字符中,在第一层字符e、i、u的后面会出现字符a。图解如下:

image.png

不同颜色的连线代表第二层中的各个字符会由上一层中的哪些字符得到,上一层中有几个这样的字符数量就为几,后面依次类推即可。


三、解题代码

解法

class Solution:
    def countVowelPermutation(self, n: int) -> int:
        a, e, i, o, u = 1, 1, 1, 1, 1
        for _ in range(n - 1):
            a, e, i, o, u = e + u + i, a + i, o + e, i, i + o
        return (a + e + i + o + u) % (10**9 + 7)
相关文章
|
5月前
|
存储 C++ 索引
最长连续序列(每天刷力扣hot100系列)
本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。
|
9月前
|
Python
掌握Python装饰器:轻松统计函数执行时间
掌握Python装饰器:轻松统计函数执行时间
545 76
|
10月前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
442 11
|
9月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
384 1
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
287 3
|
数据可视化 数据挖掘 Python
Seaborn 库创建吸引人的统计图表
【10月更文挑战第11天】本文介绍了如何使用 Seaborn 库创建多种统计图表,包括散点图、箱线图、直方图、线性回归图、热力图等。通过具体示例和代码,展示了 Seaborn 在数据可视化中的强大功能和灵活性,帮助读者更好地理解和应用这一工具。
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
516 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
168 1
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
203 0
Leetcode第十七题(电话号码的字母组合)
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
181 0

推荐镜像

更多