【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp

简介: 【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp

统计字典序元音字符串的数目【LC1641】

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

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

思路

  • 首先字符串只能包含5个元音字母,并且必须按照字典序排列,此时字母是什么其实不重要,重要的是上一个构造的字母是什么,接下来的字母必须在其之后的字母中选择(包括其)。因此在构造时只需记录上一个字符是第一个字符即可

image.png

class Solution {
    int[][] dp;
    public int countVowelStrings(int n) {
        dp = new int[n + 1][5];
        for (int i = 0; i <= n; i++){
            Arrays.fill(dp[i], -1);
        }
        return dfs(n, 0, 0);
    }
    public int dfs(int n, int index, int ch){
        if (index == n) return 1;
        if (dp[index][ch] >= 0) return dp[index][ch]; 
        int res = 0;
        for (int i = ch; i < 5; i++){
            res += dfs(n, index + 1, i);
        }
        if (dp[index][ch] == -1){
            dp[index][ch] = res;
        }
        return res;
    }
}

image.png

class Solution {
    public int countVowelStrings(int n) {
        int[] f = {1, 1, 1, 1, 1};
        for (int i = 0; i < n - 1; ++i) {
            int s = 0;
            for (int j = 0; j < 5; ++j) {
                s += f[j];
                f[j] = s;
            }
        }
        return Arrays.stream(f).sum();
    }
}
作者:ylb
链接:https://leetcode.cn/problems/count-sorted-vowel-strings/solutions/2196576/python3javacgo-yi-ti-shuang-jie-ji-yi-hu-vh2j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

image.png

目录
相关文章
|
6月前
leetcode-1220:统计元音字母序列的数目
leetcode-1220:统计元音字母序列的数目
48 0
|
6月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
49 0
|
6月前
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
38 0
|
6月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
114 0
|
4月前
|
存储
2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
|
6月前
【每日一题Day371】LC2586统计范围内的元音字符串数 | 模拟
【每日一题Day371】LC2586统计范围内的元音字符串数 | 模拟
54 1
|
6月前
【每日一题Day233】LC1170比较字符串最小字母出现频次 | 前缀和
【每日一题Day233】LC1170比较字符串最小字母出现频次 | 前缀和
38 0
|
6月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
30 0
华为机试HJ84:统计大写字母个数
华为机试HJ84:统计大写字母个数
|
容器
华为机试HJ92:在字符串中找出连续最长的数字串
华为机试HJ92:在字符串中找出连续最长的数字串