# 【LeetCode】 1641. Count Sorted Vowel Strings
## Description
> 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.
> 給予一正整數 `n`,回傳所有只包含母音 (`a`, `e`, `i`, `o`, `u`)、按照字典順序排序的字串數量。
>
> 一個字串 `s` 如果是按字典順序排序,表示對於所有有效的 `i, s[i]` 來說,`s[i+1]` 一定和他相同或是在它之前。
* 限制:
`1 <= n <= 50 `
## Example:
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
```
## Solution
* 先利用枚舉來觀察規律
* n = 1 的時候只有 aeiou
* n = 2 時
* a 有 5
* e 有 4
* i 有 3
* o 有 2
* u 有 1
* n = 3 時
* a 有 15 (15 - 0)
* e 有 10 (15 - 5)
* i 有 6 (15 - 5 - 4)
* o 有 3 (15 - 5 - 4 - 3)
* u 有 1 (15 - 5 - 4 - 3 - 2)
* 可以發現規律是上一次的總和(sum of 0~5) - 上一次到自己為止的總和(sum of 0~i)
### Code
```C++=1
class Solution {
public:
int sumTable(int* table, int size)
{
int sum = 0;
for(int i = 0; i < size; i++)
sum += table[i];
return sum;
}
int countVowelStrings(int n) {
if(n == 1)
return 5;
/*
5 aa ae ai ao au
4 ee ei eo eu
3 ii io iu
2 oo ou
1 uu
*/
int table[] = {5, 4, 3, 2, 1};
int preTable[] = {0, 5, 9, 12, 14};
for(int i = 2; i < n; i++)
{
int sum = sumTable(table, 5);
for(int j = 0; j < 5; j++)
{
table[j] = sum - preTable[j];
preTable[j] = sumTable(table, j);
}
}
return sumTable(table, 5);
}
};
```
###### tags: `LeetCode` `C++`