# Longest Ordered Subsequence of Vowels

Given a string consisting of only vowels, find the longest subsequence in the given string such that it consists of all five vowels and is a sequence of one or more a’s, followed by one or more e’s, followed by one or more i’s, followed by one or more o’s and followed by one or more u’s.

If there is more than one longest subsequence, print any one.

**Examples:**

Input :str = "aeiaaioooaauuaeiou"Output :{a, a, a, a, a, a, e, i, o, u} There are two possible outputs in this case: {a, a, a, a, a, a, e, i, o, u} and, {a, e, i, i, o, o, o, u, u, u} each of length 10Input :str = "aaauuiieeou"Output :No subsequence possible

**Approach:**

We loop through all the characters in the string recursively and follow the given conditions:

- If the subsequence is empty, we include the vowel at the current index only if it is ‘a’. Otherwise, we move on to the next index.
- If the vowel at the current index is same as the last vowel included in the subsequence, we include it.
- If the vowel at the current index is the next possible vowel (i.e a–> e–> i–> o–> u ) after the last vowel included in the subsequence, we have two options: either include it or move on to the next index. Hence we choose the one which gives the longest subsequence.
- If none of the above conditions is satisfied, we move on to the next index (to avoid invalid ordering of vowels in the subsequence).
- If we have reached the end of the string, we check if the current subsequence is valid or not. If it is valid (i.e if it contains all the vowels), we return it, else we return an empty list.

Below is the implementation of the above approach:

`# Python3 program to find the longest subsequence ` `# of vowels in the specified order ` ` ` `vowels ` `=` `[` `'a'` `, ` `'e'` `, ` `'i'` `, ` `'o'` `, ` `'u'` `] ` ` ` `# Mapping values for vowels ` `mapping ` `=` `{` `'a'` `: ` `0` `, ` `'e'` `: ` `1` `, ` `'i'` `: ` `2` `, ` `'o'` `: ` `3` `, ` `'u'` `: ` `4` `} ` ` ` `# Function to check if given subsequence ` `# contains all the vowels or not ` `def` `isValidSequence(subList): ` ` ` ` ` `for` `vowel ` `in` `vowels: ` ` ` `if` `vowel ` `not` `in` `subList: ` ` ` `return` `False` ` ` ` ` `return` `True` ` ` `# Function to find the longest subsequence of vowels ` `# in the given string in specified order ` `def` `longestSubsequence(string, subList, index): ` ` ` ` ` `# If we have reached the end of the string, ` ` ` `# return the subsequence ` ` ` `# if it is valid, else return an empty list ` ` ` `if` `index ` `=` `=` `len` `(string): ` ` ` `if` `isValidSequence(subList) ` `=` `=` `True` `: ` ` ` `return` `subList ` ` ` `else` `: ` ` ` `return` `[] ` ` ` ` ` `else` `: ` ` ` `# If there is no vowel in the subsequence yet, ` ` ` `# add vowel at current index if it is 'a', ` ` ` `# else move on to the next character ` ` ` `# in the string ` ` ` `if` `len` `(subList) ` `=` `=` `0` `: ` ` ` ` ` `if` `string[index] !` `=` `'a'` `: ` ` ` `return` `longestSubsequence(string, subList, index ` `+` `1` `) ` ` ` `else` `: ` ` ` `return` `longestSubsequence(string, subList ` `+` `\ ` ` ` `[string[index]], index ` `+` `1` `) ` ` ` ` ` `# If the last vowel in the subsequence until ` ` ` `# now is same as the vowel at current index, ` ` ` `# add it to the subsequence ` ` ` `elif` `mapping[subList[` `-` `1` `]] ` `=` `=` `mapping[string[index]]: ` ` ` `return` `longestSubsequence(string, subList ` `+` `\ ` ` ` `[string[index]], index ` `+` `1` `) ` ` ` ` ` `# If the vowel at the current index comes ` ` ` `# right after the last vowel ` ` ` `# in the subsequence, we have two options: ` ` ` `# either to add the vowel in ` ` ` `# the subsequence, or move on to next character. ` ` ` `# We choose the one which gives the longest subsequence. ` ` ` `elif` `(mapping[subList[` `-` `1` `]] ` `+` `1` `) ` `=` `=` `mapping[string[index]]: ` ` ` ` ` `sub1 ` `=` `longestSubsequence(string, subList ` `+` `\ ` ` ` `[string[index]], index ` `+` `1` `) ` ` ` `sub2 ` `=` `longestSubsequence(string, subList, index ` `+` `1` `) ` ` ` ` ` `if` `len` `(sub1) > ` `len` `(sub2): ` ` ` `return` `sub1 ` ` ` `else` `: ` ` ` `return` `sub2 ` ` ` ` ` `else` `: ` ` ` `return` `longestSubsequence(string, subList, index ` `+` `1` `) ` ` ` `# Driver Code ` `if` `__name__ ` `=` `=` `"__main__"` `: ` ` ` ` ` `string ` `=` `"aeiaaioooauuaeiou"` ` ` ` ` `subsequence ` `=` `longestSubsequence(string, [], ` `0` `) ` ` ` `if` `len` `(subsequence) ` `=` `=` `0` `: ` ` ` `print` `(` `"No subsequence possible"` `) ` ` ` `else` `: ` ` ` `print` `(subsequence) ` ` ` |

*chevron_right*

*filter_none*

**Output:**

['a', 'e', 'i', 'i', 'o', 'o', 'o', 'u', 'u', 'u']

## Recommended Posts:

- Length of longest common subsequence containing vowels
- Longest substring of vowels
- Longest substring having K distinct vowels
- Longest subsequence such that every element in the subsequence is formed by multiplying previous element with a prime
- Longest subsequence with no 0 after 1
- Longest subsequence with a given AND value | O(N)
- Longest subsequence with a given AND value
- Longest Zig-Zag Subsequence
- Longest dividing subsequence
- Longest Increasing Subsequence using BIT
- Longest subsequence whose average is less than K
- Longest Uncommon Subsequence
- Longest Palindromic Subsequence | DP-12
- Longest Common Subsequence | DP-4
- Longest Bitonic Subsequence | DP-15

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.