题目描述

Given an integer n, your task is to count how many strings of length n can be formed under the following rules:

Each character is a lower case vowel (‘a’, ‘e’, ‘i’, ‘o’, ‘u’)
Each vowel ‘a’ may only be followed by an ‘e’.
Each vowel ‘e’ may only be followed by an ‘a’ or an ‘i’.
Each vowel ‘i’ may not be followed by another ‘i’.
Each vowel ‘o’ may only be followed by an ‘i’ or a ‘u’.
Each vowel ‘u’ may only be followed by an ‘a’.
Since the answer may be too large, return it modulo 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

思路

动态规划。dp[i][j]表示长度为i,以j为结尾,的串,个数。
根据限制条件可以推出每个字符前边的字符是什么,以当前字符结尾的个数为所有它前面可以出现的字符的个数之和。

代码

class Solution {public:int countVowelPermutation(int n) {int MOD = 1e9+7;vector<vector<long long int> > dp(n+1, vector<long long>(5+1, 0));for (int i=1; i<=5; ++i) {dp[1][i] = 1;}for (int i=2; i<=n; ++i) {for (int j=1; j<=5; ++j) {long long tmp = 0;if (j == 1) {tmp = (dp[i-1][2]%MOD + dp[i-1][3]%MOD + dp[i-1][5]%MOD)%MOD;}else if (j == 2) {tmp = (dp[i-1][3]%MOD + dp[i-1][1]%MOD)%MOD;}else if (j == 3) {tmp = (dp[i-1][4]%MOD + dp[i-1][2]%MOD)%MOD;}else if (j == 4) {tmp = dp[i-1][3]%MOD;}else {tmp = (dp[i-1][3]%MOD + dp[i-1][4]%MOD);}dp[i][j] += tmp;dp[i][j] %= MOD;}}long long res = 0;for (int i=1; i<=5; ++i) {res += dp[n][i];res %= MOD;}return res;}
};

最后不能直接求和然后取模,会超long long。
动态规划修行告一段落。甚至感觉比大学的时候理解的更深一点。
洗漱睡觉喽。

【LeetCode 1220】 Count Vowels Permutation相关推荐

  1. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  2. 【LeetCode - 32】最长有效括号

    给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度. 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 " ...

  3. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有两个节点--左孩 ...

  4. 【LeetCode笔记】253. 会议室 II(Java、偏数学)

    文章目录 题目描述 思路 && 代码 计划里 hot 100 + 剑指Offer 的题目中唯一一道会员题,同时也是最后一道没写的题,刚好今天 leetcode 发了一天会员可以写上-简 ...

  5. 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形

    题目描述 ` 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给 ...

  6. 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 [所有可能结果]-> [暴力DFS] 思路 && 代码 代码比较长,但是总体思路很清晰. 剪枝:舍弃左括号. ...

  7. 【Uva 1220】Party at Hali-Bula

    [Link]:https://cn.vjudge.net/contest/170078#problem/M [Description] 求一个树的最大独立子集; (即树的一个点集,这个点集中任意两个点 ...

  8. 每日一题:1220. 统计元音字母序列的数目(Count Vowels Permutation)

    这题是7/4/2021英文站leetcode的每日一题, 想把自己的想法和思路记录下来. 题目: Given an integer n, your task is to count how many ...

  9. 【leetcode 字符串】466. Count The Repetitions

    https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandy ...

最新文章

  1. 华为手机拍照后图库里无照片_华为图库中上千张照片,如何快速找到想要的照片?...
  2. 文件服务器 工作站 通信媒体,【2013年自考“网络操作系统”复习资料(22)】- 环球网校...
  3. php mysql-mysqli
  4. linux下json数据解析,Linux下使用jq简单解析json的方法
  5. HarmonyOS之系统设置项的查询和使用
  6. winform 配置文件的加密解密
  7. dae怎么用草图大师打开_当 to C市场饱和,该怎么用场景化打开新市场?
  8. 优化器,SGD+Momentum;Adagrad;RMSProp;Adam
  9. 创建一个坚固的备份系统
  10. 前端学习(1022):jquery学习目标
  11. 准确率 召回率_机器学习中F值(F-Measure)、准确率(Precision)、召回率(Recall)
  12. pdf在html网页中打开是乱码,pdf.js浏览中文pdf乱码的问题解决
  13. intellij idea 忽略文件不提交
  14. 计算电磁学及其在复杂电磁环境数值模拟中的应用和发展趋势
  15. 【HikariCP】HikariCP配置参数
  16. 计算机常见故障原因有哪些,电脑常见故障原因及解决方法
  17. 神奇的零知识证明,既能保守秘密,又能让别人信你!
  18. 方阵求值——上三角行列式、定义(康拓展开求值)
  19. HTML-文本格式化
  20. POSIX标准是什么?

热门文章

  1. uniapp 搜索关键字高亮显示实现
  2. 干货!蓝桥杯单片机组一经验分享
  3. swagger Could not resolve pointer: /definitions/Person does not exist in document
  4. 德国转专业申请计算机,详细攻略:在德国,如何转学或转专业?
  5. Jackson 数据类型转换(使用JavaType)
  6. js 根据id 取出数组中对应的对象
  7. Flink系列之Flink 流式编程模式总结
  8. Redis分片主从哨兵集群,原理详解,集群的配置安装,8大数据类型,springboot整合使用
  9. DynaBeanHolder动态bean构造器实现
  10. C++ 优先队列priority_queue,如何定义大小根堆