zl程序教程

您现在的位置是:首页 >  后端

当前栏目

力扣解法汇总1220-统计元音字母序列的数目

统计序列 汇总 力扣 解法 字母 数目 元音
2023-09-11 14:18:53 时间

原题链接:力扣


描述:

给你一个整数 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;
    }