本文正在参加「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
题意分析:
- 当前字母的选择,和上一次的选择有关,上一次的选择会限制当前的选择。
我们将当前字母选择为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%的用户