Count all possible N-length vowel permutations that can be generated based on the given conditions
Last Updated :
15 Jan, 2024
Given an integer N, the task is to count the number of N-length strings consisting of lowercase vowels that can be generated based the following conditions:
- Each 'a' may only be followed by an 'e'.
- Each 'e' may only be followed by an 'a' or an 'i'.
- Each 'i' may not be followed by another 'i'.
- Each 'o' may only be followed by an 'i' or a 'u'.
- Each 'u' may only be followed by an 'a'.
Examples:
Input: N = 1
Output: 5
Explanation: All strings that can be formed are: "a", "e", "i", "o" and "u".
Input: N = 2
Output: 10
Explanation: All strings that can be formed are: "ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou" and "ua".
Approach: The idea to solve this problem is to visualize this as a Graph Problem. From the given rules a directed graph can be constructed, where an edge from u to v means that v can be immediately written after u in the resultant strings. The problem reduces to finding the number of N-length paths in the constructed directed graph. Follow the steps below to solve the problem:
- Let the vowels a, e, i, o, u be numbered as 0, 1, 2, 3, 4 respectively, and using the dependencies shown in the given graph, convert the graph into an adjacency list relation where the index signifies the vowel and the list at that index signifies an edge from that index to the characters given in the list.

- Initialize a 2D array dp[N + 1][5] where dp[N][char] denotes the number of directed paths of length N which end at a particular vertex char.
- Initialize dp[i][char] for all the characters as 1, since a string of length 1 will only consist of one vowel in the string.
- For all possible lengths, say i, traverse over the directed edges using variable u and perform the following steps:
- Update the value of dp[i + 1][u] as 0.
- Traverse the adjacency list of the node u and increment the value of dp[i][u] by dp[i][v], that stores the sum of all the values such that there is a directed edge from node u to node v.
- After completing the above steps, the sum of all the values dp[N][i], where i belongs to the range [0, 5), will give the total number of vowel permutations.
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find the number of
// vowel permutations possible
int countVowelPermutation(int n)
{
// To avoid the large output value
int MOD = (int)(1e9 + 7);
// Initialize 2D dp array
long dp[n + 1][5];
// Initialize dp[1][i] as 1 since
// string of length 1 will consist
// of only one vowel in the string
for(int i = 0; i < 5; i++)
{
dp[1][i] = 1;
}
// Directed graph using the
// adjacency matrix
vector<vector<int>> relation = {
{ 1 }, { 0, 2 },
{ 0, 1, 3, 4 },
{ 2, 4 }, { 0 }
};
// Iterate over the range [1, N]
for(int i = 1; i < n; i++)
{
// Traverse the directed graph
for(int u = 0; u < 5; u++)
{
dp[i + 1][u] = 0;
// Traversing the list
for(int v : relation[u])
{
// Update dp[i + 1][u]
dp[i + 1][u] += dp[i][v] % MOD;
}
}
}
// Stores total count of permutations
long ans = 0;
for(int i = 0; i < 5; i++)
{
ans = (ans + dp[n][i]) % MOD;
}
// Return count of permutations
return (int)ans;
}
// Driver code
int main()
{
int N = 2;
cout << countVowelPermutation(N);
}
// This code is contributed by Mohit kumar 29
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG {
// Function to find the number of
// vowel permutations possible
public static int
countVowelPermutation(int n)
{
// To avoid the large output value
int MOD = (int)(1e9 + 7);
// Initialize 2D dp array
long[][] dp = new long[n + 1][5];
// Initialize dp[1][i] as 1 since
// string of length 1 will consist
// of only one vowel in the string
for (int i = 0; i < 5; i++) {
dp[1][i] = 1;
}
// Directed graph using the
// adjacency matrix
int[][] relation = new int[][] {
{ 1 }, { 0, 2 },
{ 0, 1, 3, 4 },
{ 2, 4 }, { 0 }
};
// Iterate over the range [1, N]
for (int i = 1; i < n; i++) {
// Traverse the directed graph
for (int u = 0; u < 5; u++) {
dp[i + 1][u] = 0;
// Traversing the list
for (int v : relation[u]) {
// Update dp[i + 1][u]
dp[i + 1][u] += dp[i][v] % MOD;
}
}
}
// Stores total count of permutations
long ans = 0;
for (int i = 0; i < 5; i++) {
ans = (ans + dp[n][i]) % MOD;
}
// Return count of permutations
return (int)ans;
}
// Driver Code
public static void main(String[] args)
{
int N = 2;
System.out.println(
countVowelPermutation(N));
}
}
Python3
# Python 3 program for the above approach
# Function to find the number of
# vowel permutations possible
def countVowelPermutation(n):
# To avoid the large output value
MOD = 1e9 + 7
# Initialize 2D dp array
dp = [[0 for i in range(5)] for j in range(n + 1)]
# Initialize dp[1][i] as 1 since
# string of length 1 will consist
# of only one vowel in the string
for i in range(5):
dp[1][i] = 1
# Directed graph using the
# adjacency matrix
relation = [[1],[0, 2], [0, 1, 3, 4], [2, 4],[0]]
# Iterate over the range [1, N]
for i in range(1, n, 1):
# Traverse the directed graph
for u in range(5):
dp[i + 1][u] = 0
# Traversing the list
for v in relation[u]:
# Update dp[i + 1][u]
dp[i + 1][u] += dp[i][v] % MOD
# Stores total count of permutations
ans = 0
for i in range(5):
ans = (ans + dp[n][i]) % MOD
# Return count of permutations
return int(ans)
# Driver code
if __name__ == '__main__':
N = 2
print(countVowelPermutation(N))
# This code is contributed by bgangwar59.
C#
// C# program to find absolute difference
// between the sum of all odd frequency and
// even frequent elements in an array
using System;
using System.Collections.Generic;
class GFG {
// Function to find the number of
// vowel permutations possible
static int countVowelPermutation(int n)
{
// To avoid the large output value
int MOD = (int)(1e9 + 7);
// Initialize 2D dp array
long[,] dp = new long[n + 1, 5];
// Initialize dp[1][i] as 1 since
// string of length 1 will consist
// of only one vowel in the string
for (int i = 0; i < 5; i++) {
dp[1, i] = 1;
}
// Directed graph using the
// adjacency matrix
List<List<int>> relation = new List<List<int>>();
relation.Add(new List<int> { 1 });
relation.Add(new List<int> { 0, 2 });
relation.Add(new List<int> { 0, 1, 3, 4 });
relation.Add(new List<int> { 2, 4 });
relation.Add(new List<int> { 0 });
// Iterate over the range [1, N]
for (int i = 1; i < n; i++)
{
// Traverse the directed graph
for (int u = 0; u < 5; u++)
{
dp[i + 1, u] = 0;
// Traversing the list
foreach(int v in relation[u])
{
// Update dp[i + 1][u]
dp[i + 1, u] += dp[i, v] % MOD;
}
}
}
// Stores total count of permutations
long ans = 0;
for (int i = 0; i < 5; i++)
{
ans = (ans + dp[n, i]) % MOD;
}
// Return count of permutations
return (int)ans;
}
// Driver code
static void Main() {
int N = 2;
Console.WriteLine(countVowelPermutation(N));
}
}
// This code is contributed by divyesh072019.
JavaScript
<script>
// JavaScript program to implement
// the above approach
// Function to find the number of
// vowel permutations possible
function
countVowelPermutation(n)
{
// To avoid the large output value
let MOD = (1e9 + 7);
// Initialize 2D dp array
let dp = new Array(n + 1);
// Loop to create 2D array using 1D array
for (var i = 0; i < dp.length; i++) {
dp[i] = new Array(2);
}
// Initialize dp[1][i] as 1 since
// string of length 1 will consist
// of only one vowel in the string
for (let i = 0; i < 5; i++) {
dp[1][i] = 1;
}
// Directed graph using the
// adjacency matrix
let relation = [
[ 1 ], [ 0, 2 ],
[ 0, 1, 3, 4 ],
[ 2, 4 ], [ 0 ]
];
// Iterate over the range [1, N]
for (let i = 1; i < n; i++) {
// Traverse the directed graph
for (let u = 0; u < 5; u++) {
dp[i + 1][u] = 0;
// Traversing the list
for (let v in relation[u]) {
// Update dp[i + 1][u]
dp[i + 1][u] += dp[i][v] % MOD;
}
}
}
// Stores total count of permutations
let ans = 0;
for (let i = 0; i < 5; i++) {
ans = (ans + dp[n][i]) % MOD;
}
// Return count of permutations
return ans;
}
// Driver code
let N = 2;
document.write(
countVowelPermutation(N));
</script>
Time Complexity: O(N)
Auxiliary Space: O(N)
Efficient Approach: As we see that we only need current and previous state of the dp array, We can definitely space optimize the above solution. We can have 5 variables of previous state and 5 variables of current state that we need to compute with the given mapping relations.
Below is the implementation of above approach.
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find the number of
// vowel permutations possible
int countVowelPermutation(int n)
{
const int MOD = 1e9 + 7;
// initialize current and previous state
// variables.
long a = 1, e = 1, i = 1, o = 1, u = 1, a_new, e_new, i_new, o_new, u_new;
for(int j = 2; j <= n; j++) {
// respective conditions
a_new = e;
e_new = (a + i) % MOD;
i_new = (a + e + o + u) % MOD;
o_new = (i + u) % MOD;
u_new = a;
// make current computed states
// to make them previous for next computing
// future states
a = a_new, e = e_new, i = i_new, o = o_new, u = u_new;
}
// return the answer
return (a + e + i + o + u) % MOD;
}
// Driver code
int main()
{
int N = 2;
cout << countVowelPermutation(N);
}
Java
public class VowelPermutation {
static int countVowelPermutation(int n)
{
// Define the modulo value
final int MOD = 1000000007;
// Initialize current and previous state variables
int a = 1, e = 1, i = 1, o = 1, u = 1;
for (int j = 2; j <= n; j++) {
// Calculate new states based on conditions
int aNew = e;
int eNew = (a + i) % MOD;
int iNew = (a + e + o + u) % MOD;
int oNew = (i + u) % MOD;
int uNew = a;
// Update current states for the next
// computation
a = aNew;
e = eNew;
i = iNew;
o = oNew;
u = uNew;
}
// Return the result
return (a + e + i + o + u) % MOD;
}
public static void main(String[] args)
{
// Driver code
int N = 2;
System.out.println(countVowelPermutation(N));
}
}
Python3
def countVowelPermutation(n):
MOD = 10 ** 9 + 7
# Initialize current and previous state variables.
a = e = i = o = u = 1
for j in range(2, n + 1):
# Respective conditions
a_new = e
e_new = (a + i) % MOD
i_new = (a + e + o + u) % MOD
o_new = (i + u) % MOD
u_new = a
# Update current states for next computation
a, e, i, o, u = a_new, e_new, i_new, o_new, u_new
# Return the answer
return (a + e + i + o + u) % MOD
# Driver code
N = 2
print(countVowelPermutation(N))
C#
using System;
class Program {
// Function to find the number of vowel permutations
// possible
static int CountVowelPermutation(int n)
{
const int MOD = 1000000007;
// Initialize current and previous state variables.
long a = 1, e = 1, i = 1, o = 1, u = 1, a_new,
e_new, i_new, o_new, u_new;
for (int j = 2; j <= n; j++) {
// Respective conditions
a_new = e;
e_new = (a + i) % MOD;
i_new = (a + e + o + u) % MOD;
o_new = (i + u) % MOD;
u_new = a;
// Make current computed states
// to make them previous for next computing
// future states
a = a_new;
e = e_new;
i = i_new;
o = o_new;
u = u_new;
}
// Return the answer
return (int)((a + e + i + o + u) % MOD);
}
// Driver code
static void Main()
{
int N = 2;
Console.WriteLine(CountVowelPermutation(N));
}
}
JavaScript
function countVowelPermutation(n) {
const MOD = 10 ** 9 + 7;
// Initialize current and previous state variables.
let a = e = i = o = u = 1;
for (let j = 2; j <= n; j++) {
// Respective conditions
const a_new = e;
const e_new = (a + i) % MOD;
const i_new = (a + e + o + u) % MOD;
const o_new = (i + u) % MOD;
const u_new = a;
// Update current states for next computation
a = a_new;
e = e_new;
i = i_new;
o = o_new;
u = u_new;
}
// Return the answer
return (a + e + i + o + u) % MOD;
}
// Driver code
const N = 2;
console.log(countVowelPermutation(N));
Time Complexity: O(N)
Space Complexity: O(1)
Similar Reads
Count all possible strings that can be generated by placing spaces Given a string S, the task is to count all possible strings that can be generated by placing spaces between any pair of adjacent characters of the string. Examples: Input: S = "AB"Output: 2Explanation: All possible strings are { "A B", "AB"}. Input: S = "ABC"Output: 4Explanation: All possible string
4 min read
Count of strings that can be formed using a, b and c under given constraints Given a length n, count the number of strings of length n that can be made using 'a', 'b' and 'c' with at most one 'b' and two 'c's allowed. Examples : Input : n = 3 Output : 19 Below strings follow given constraints: aaa aab aac aba abc aca acb acc baa bac bca bcc caa cab cac cba cbc cca ccb Input
14 min read
Count all possible texts that can be formed from Number using given mapping Given a number N and a mapping of letters to each integer from 1 to 8, which are: {1: 'abc', 2: 'def', 3: 'ghi', 4: 'jkl', 5: 'mno', 6: 'pqr', 7: 'stu', 8: 'wxyz'}The mapping denotes that a single 1 can be replaced by 'a', a pair of 1 can be replaced by 'b' and a triplet of 1 can be replaced by 'c'.
15+ min read
Count pairs of strings that satisfy the given conditions Given an array arr[] of N strings consisting of lowercase characters, the task is to count the pairs in the array which satisfy the given conditions: Both strings have an equal number of pairs.The first vowels of both the strings are same.The last vowel of both strings is the same. Note that a strin
6 min read
Count of distinct permutations of length N having no similar adjacent characters Given an integer N, the task is to calculate the total number of distinct permutations of length N, consisting only of letters 'a', 'b', and 'c', with repetitions allowed, such that no two adjacent characters are the same. Input: N = 3 Output: 12 Explanation: Possible permutations satisfying the req
3 min read