问题描述
思路分析及代码实现
今天的题目是一个hard难度的,本来是想直接放弃的,但习惯性的看了一下内容,感觉还是比较容易想出来的。
通过分析题目,不难看出这是一道动态规划的题。
然后尝试找出他的状态转移方程
试分析:
首先dp[i][j]的含义是长度为 i 的字符串,以 j 字符为结尾的个数,这里我们将字母转换成数字,可以表示为(0,1,2,3,4)
- 每个元音 ‘a’ 后面都只能跟着 ‘e’ :
- 每个元音 ‘e’ 后面只能跟着 ‘a’ 或者是 ‘i’
- 每个元音 ‘i’ 后面 不能 再跟着另一个 ‘i’
- 每个元音 ‘o’ 后面只能跟着 ‘i’ 或者是 ‘u’
- 每个元音 ‘u’ 后面只能跟着 ‘a’
根据dp的含义,我们就可以把给的条件换一种说法:
- 元音’a’前面只能是’e’、‘i’、‘u’ : dp[i][0] = dp[i-1][1]+dp[i-1][2] +dp[i-1][4]
- 元音’e’前面只能是’a’、‘i’: dp[i][1] = dp[i-1][0]+dp[i-1][2]
- 元音’i’前面只能是’e’、‘o’: dp[i][2] = dp[i-1][1]+dp[i-1][3]
- 元音’o’前面只能是’i’: dp[i][3] = dp[i-1][2]
- 元音’u’前面只能是’i’、‘o’: dp[i][4] = dp[i-1][2]+dp[i-1][3]
最后把求每个元音字母为结尾的字符串的个数和就可以了
class Solution:
def countVowelPermutation(self, n: int) -> int:
dp = (1,1,1,1,1)
for _ in range(n-1):
dp = ((dp[1]+dp[2]+dp[4])%1000000007, (dp[0]+dp[2])%1000000007, (dp[1]+dp[3])%1000000007, dp[2]%1000000007, (dp[2]+dp[3])%1000000007)
return sum(dp) % 1000000007