力扣解法汇总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
 

提示:

1 <= n <= 2 * 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-vowels-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

* 解题思路:
* 首先我们转换一下描述,每个字母之后可选择的列表如下:
* a:{e}
* e:{a,i}
* i:{a,e,o,u}
* o:{u,i}
* u:{a}
* 我们每次运算之后,只要分别统计最后一位"a", "e", "i" , "o" 和 "u"的数量即可。
* 这样有了每一种字符的数量,我们就可以知道长度多一位时有多少种可能。
* 比如a=4时,对应4种可能。e=3时对应3*2=6种可能。
* 不过本题的难点时取模,我的方案时每一次运算的时候都取模。

代码:

  public int countVowelPermutation(int n) {
        int aNum = 0;
        int eNum = 0;
        int iNum = 0;
        int oNum = 0;
        int uNum = 0;
        int sum = 0;

        for (int i = 0; i < n; i++) {
            if (i == 0) {
                aNum++;
                eNum++;
                iNum++;
                oNum++;
                uNum++;
                sum = 5;
                continue;
            }
            int sumLocal = 0;
            int aNumLocal = 0;
            int eNumLocal = 0;
            int iNumLocal = 0;
            int oNumLocal = 0;
            int uNumLocal = 0;

            //a
            eNumLocal = getValue(eNumLocal, aNum);
            sumLocal = getValue(sumLocal, aNum);

            //e
            aNumLocal = getValue(aNumLocal, eNum);
            sumLocal = getValue(sumLocal, eNum);

            iNumLocal = getValue(iNumLocal, eNum);
            sumLocal = getValue(sumLocal, eNum);

            //i
            aNumLocal = getValue(aNumLocal, iNum);
            sumLocal = getValue(sumLocal, iNum);

            eNumLocal = getValue(eNumLocal, iNum);
            sumLocal = getValue(sumLocal, iNum);

            oNumLocal = getValue(oNumLocal, iNum);
            sumLocal = getValue(sumLocal, iNum);

            uNumLocal = getValue(uNumLocal, iNum);
            sumLocal = getValue(sumLocal, iNum);


            //o
            iNumLocal = getValue(iNumLocal, oNum);
            sumLocal = getValue(sumLocal, oNum);

            uNumLocal = getValue(uNumLocal, oNum);
            sumLocal = getValue(sumLocal, oNum);

            //u
            aNumLocal = getValue(aNumLocal, uNum);
            sumLocal = getValue(sumLocal, uNum);

            //取模
            aNum = aNumLocal;
            eNum = eNumLocal;
            iNum = iNumLocal;
            oNum = oNumLocal;
            uNum = uNumLocal;
            sum = sumLocal;
        }
        return sum;
    }

    public int getValue(int oldValue, int addValue) {
        return (oldValue + addValue) % 1000000007;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失落夏天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值