Leetcode每日一题 1220. 统计元音字母序列的数目

问题描述

在这里插入图片描述

思路分析及代码实现

今天的题目是一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的嘤嘤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值