[每日一题]1641.统计字典序元音字符串的数目
1641. 统计字典序元音字符串的数目 给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。
字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。
输入:n = 1 输出:5 解释:仅由元音组成的 5 个字典序字符串为 [“a”,”e”,”i”,”o”,”u”]
输入:n = 2 输出:15 解释:仅由元音组成的 15 个字典序字符串为 [“aa”,”ae”,”ai”,”ao”,”au”,”ee”,”ei”,”eo”,”eu”,”ii”,”io”,”iu”,”oo”,”ou”,”uu”] 注意,”ea” 不是符合题意的字符串,因为 ‘e’ 在字母表中的位置比 ‘a’ 靠后
提示:
1 <= n <= 50
Solutions
class Solution {
public int countVowelStrings(int n) {
if(n==0) return 0;
int[] dp = {1,1,1,1,1};
for(int i=2;i<=n;i++){
for(int j = 0;j<5;j++){
for(int k =j+1;k<5;k++){
dp[j]+=dp[k];
}
}
}
return dp[0]+dp[1]+dp[2]+dp[3]+dp[4];
}
}
Ideas
方法一:动态规划
分别使用数字 0,1,2,3,4 代表元音字符 ‘a’,‘e’,‘i’,‘o’,‘u’。记
dp[i][j]
表示长度为 i+1,以 j 结尾的按字典序排列的字符串数量,那么状态转移方程如下:
dp[i][j]=1 i=0
dp[i][j]=∑ j k=0 dp[i−1][k] i>0
因此长度为 n 的按字典序排列的字符串数量为 ∑ 4 k=0 dp[n−1][j]
。因为 dp[i] 的计算只涉及 dp[i−1] 部分的数据,同时 dp[i] 等价于 dp[i−1] 的前缀和,我们可以只使用一维数组进行存储,同时在一维数组进行原地修改。