【DP002】 字典元音数

245 阅读1分钟

本文正在参加「Java主题月 - Java开发实战」,详情查看:juejin.cn/post/696719…

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

字典原音数

1641. 统计字典序元音字符串的数目

题目

给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。

字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。

示例 1:

输入:n = 1 输出:5 解释:仅由元音组成的 5 个字典序字符串为 ["a","e","i","o","u"] 示例 2:

输入:n = 2 输出:15 解释:仅由元音组成的 15 个字典序字符串为 ["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"] 注意,"ea" 不是符合题意的字符串,因为 'e' 在字母表中的位置比 'a' 靠后 示例 3:

输入:n = 33 输出:66045

提示:

1 <= n <= 50

方法签名

    public int countVowelStrings(int n) {

    }

First pass

题意分析:

  1. 当前字母的选择,和上一次的选择有关,上一次的选择会限制当前的选择。

我们将当前字母选择为i所有可能的组合数规定为F[i],那么:

  • 0<=i<=4

同时我们需要注意到:

  • 如果第一个字母选择为u,那么第二次选择只能选择为u;第一次选择为a,那么第二次选择能选任意的字母。

因此可以确定:

  • 下一个F[i]= 前一个F[i-1] +前一个F[i-2]+...(i>0)

由于:

  • 最终的结果是由最后一位选择5个字母的组合相加得出

因此可以写出如下的答案:

    public static int countVowelStrings(int n) {
        int[] f = {1,1,1,1,1};
        for(int i=1;i<n;i++){
            //更新滚动数组
            //从后往前更新
            for(int j = 4;j>0;j--){
                for(int m = 0;m<j;m++){
                    f[j] += f[m];
                }
            }
        }
        int res = 0;
        for (int i : f) {
            res += i;
        }
        return res;
    }

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:35 MB, 在所有 Java 提交中击败了93.86%的用户