Question

Formatted question description: https://leetcode.ca/all/1641.html

 1641. Count Sorted Vowel Strings

 Given an integer n, return the number of strings of length n that consist only of vowels (a, e, i, o, u) and are lexicographically sorted.

 A string s is lexicographically sorted if for all valid i, s[i] is the same as or comes before s[i+1] in the alphabet.


 Example 1:

 Input: n = 1
 Output: 5
 Explanation: The 5 sorted strings that consist of vowels only are ["a","e","i","o","u"].


 Example 2:

 Input: n = 2
 Output: 15
 Explanation: The 15 sorted strings that consist of vowels only are
 ["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"].
 Note that "ea" is not a valid string since 'e' comes after 'a' in the alphabet.


 Example 3:

 Input: n = 33
 Output: 66045


 Constraints:
     1 <= n <= 50

Algorithm

Use dynamic programming. Create a 2D array dp of n rows and 5 columns, where dp[i][j] represents the number of sorted vowel strings of length i + 1 with the first j + 1 vowel letters. Initially, dp[0][i] = i + 1 for 0 <= i < 5, and dp[i][0] = 1 for 0 <= i < n. For 1 <= i < n and 1 <= j < 5, there is dp[i][j] = dp[i - 1][j] + dp[i][j - 1]. Finally, return dp[n - 1][4].

Or, use math, the combination result.

Code

Java

public class Count_Sorted_Vowel_Strings {

    class Solution {
        public int countVowelStrings(int n) {

            // dp[n][k] means the number of strings constructed by at most k different characters.
            int[][] dp = new int[n + 1][6];

            for (int i = 1; i <= n; ++i) {
                for (int k = 1; k <= 5; ++k) {
                    dp[i][k] = dp[i][k - 1] + (i > 1 ? dp[i - 1][k] : 1); // i=1 then only one string, eg "aaaaa"
                }
            }

            return dp[n][5];
        }

    }

    class Solution_Math {
        public int countVowelStrings(int n) {
            return (n + 1) * (n + 2) * (n + 3) * (n + 4) / 24;
        }
    }
}

Java

class Solution {
    public int countVowelStrings(int n) {
        int[][] dp = new int[n][5];
        for (int i = 0; i < 5; i++)
            dp[0][i] = i + 1;
        for (int i = 1; i < n; i++) {
            dp[i][0] = 1;
            for (int j = 1; j < 5; j++)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
        return dp[n - 1][4];
    }
}

All Problems

All Solutions