Length of longest common subsequence containing vowels

14 May, 2021
Given two strings X and Y of length m and n respectively. The problem is to find the length of the longest common subsequence of strings X and Y which contains all vowel characters.
Examples: 
Input : X = "aieef" 
        Y = "klaief"
Output : aie


Input : X = "geeksforgeeks" 
        Y = "feroeeks"
Output : eoee
Source: Paytm Interview Experience ( Backend Developer ). Naive Approach: Generate all subsequences of both given sequences and find the longest matching subsequence which contains all vowel characters. This solution is exponential in term of time complexity.
Efficient Approach (Dynamic Programming): This approach is a variation to Longest Common Subsequence | DP-4 problem.
The difference in this post is just that the common subsequence characters must all be vowels. 
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation to find the length of longest common// subsequence which contains all vowel characters#include <bits/stdc++.h> using namespace std; // function to check whether 'ch'// is a vowel or notbool isVowel(char ch){    if (ch == 'a' || ch == 'e' || ch == 'i'        || ch == 'o' || ch == 'u')        return true;    return false;} // function to find the length of longest common subsequence// which contains all vowel charactersint lcs(char* X, char* Y, int m, int n){    int L[m + 1][n + 1];    int i, j;     // Following steps build L[m+1][n+1] in bottom up fashion. Note    // that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1]    for (i = 0; i <= m; i++) {        for (j = 0; j <= n; j++) {            if (i == 0 || j == 0)                L[i][j] = 0;             else if ((X[i - 1] == Y[j - 1]) && isVowel(X[i - 1]))                L[i][j] = L[i - 1][j - 1] + 1;             else                L[i][j] = max(L[i - 1][j], L[i][j - 1]);        }    }     // L[m][n] contains length of LCS for X[0..n-1] and Y[0..m-1]    // which contains all vowel characters    return L[m][n];} // Driver program to test aboveint main(){    char X[] = "aieef";    char Y[] = "klaief";     int m = strlen(X);    int n = strlen(Y);     cout << "Length of LCS = "         << lcs(X, Y, m, n);     return 0;}
// Java implementation to find the// length of longest common subsequence// which contains all vowel charactersclass GFG{ // function to check whether 'ch'// is a vowel or notstatic boolean isVowel(char ch){    if (ch == 'a' || ch == 'e' ||        ch == 'i' || ch == 'o' ||        ch == 'u')        return true;    return false;} // function to find the length of// longest common subsequence which// contains all vowel charactersstatic int lcs(String X, String Y,               int m, int n){    int L[][] = new int[m + 1][n + 1];    int i, j;     // Following steps build L[m+1][n+1]    // in bottom up fashion. Note that    // L[i][j] contains length of LCS of    // X[0..i-1] and Y[0..j-1]    for (i = 0; i <= m; i++)    {        for (j = 0; j <= n; j++)        {            if (i == 0 || j == 0)                L[i][j] = 0;             else if ((X.charAt(i - 1) == Y.charAt(j - 1)) &&                                isVowel(X.charAt(i - 1)))                L[i][j] = L[i - 1][j - 1] + 1;             else                L[i][j] = Math.max(L[i - 1][j],                                   L[i][j - 1]);        }    }     // L[m][n] contains length of LCS    // for X[0..n-1] and Y[0..m-1]    // which contains all vowel characters    return L[m][n];} // Driver Codepublic static void main(String[] args){    String X = "aieef";    String Y = "klaief";     int m = X.length();    int n = Y.length();     System.out.println("Length of LCS = " +                          lcs(X, Y, m, n));}} // This code is contributed by Bilal
# Python3 implementation to find the# length of longest common subsequence# which contains all vowel characters # function to check whether 'ch'# is a vowel or notdef isVowel(ch):    if (ch == 'a' or ch == 'e' or        ch == 'i'or ch == 'o' or        ch == 'u'):        return True    return False # function to find the length of longest# common subsequence which contains all# vowel charactersdef lcs(X, Y, m, n):     L = [[0 for i in range(n + 1)]            for j in range(m + 1)]    i, j = 0, 0      # Following steps build L[m+1][n+1] in    # bottom up fashion. Note that L[i][j]    # contains length of LCS of X[0..i-1]    # and Y[0..j-1]    for i in range(m + 1):        for j in range(n + 1):            if (i == 0 or j == 0):                L[i][j] = 0            elif ((X[i - 1] == Y[j - 1]) and                      isVowel(X[i - 1])):                L[i][j] = L[i - 1][j - 1] + 1            else:                L[i][j] = max(L[i - 1][j],                              L[i][j - 1])         # L[m][n] contains length of LCS for    # X[0..n-1] and Y[0..m-1] which    # contains all vowel characters    return L[m][n] # Driver CodeX = "aieef"Y = "klaief" m = len(X)n = len(Y) print("Length of LCS =", lcs(X, Y, m, n)) # This code is contributed by Mohit Kumar
// C# implementation to find the// length of longest common subsequence// which contains all vowel charactersusing System; class GFG{ // function to check whether// 'ch' is a vowel or notstatic int isVowel(char ch){    if (ch == 'a' || ch == 'e' ||        ch == 'i' || ch == 'o' ||        ch == 'u')        return 1;    return 0;} // find max valuestatic int max(int a, int b){    return (a > b) ? a : b;} // function to find the length of// longest common subsequence which// contains all vowel charactersstatic int lcs(String X, String Y,               int m, int n){    int [,]L = new int[m + 1, n + 1];    int i, j;     // Following steps build L[m+1,n+1]    // in bottom up fashion. Note that    // L[i,j] contains length of LCS of    // X[0..i-1] and Y[0..j-1]    for (i = 0; i <= m; i++)    {        for (j = 0; j <= n; j++)        {            if (i == 0 || j == 0)                L[i, j] = 0;             else if ((X[i - 1] == Y[j - 1]) &&                    isVowel(X[i - 1]) == 1)                L[i, j] = L[i - 1, j - 1] + 1;              else                L[i, j] = max(L[i - 1, j],                              L[i, j - 1]);        }    }     // L[m,n] contains length of LCS    // for X[0..n-1] and Y[0..m-1]    // which contains all vowel characters    return L[m, n];} // Driver Codestatic public void Main(String []args){    String X = "aieef";    String Y = "klaief";     int m = X.Length;    int n = Y.Length;     Console.WriteLine("Length of LCS = " +                         lcs(X, Y, m, n));}} // This code is contributed by Arnab Kundu
<?php// PHP implementation to find the length of// longest common subsequence which contains// all vowel characters // function to check whether 'ch'// is a vowel or notfunction isVowel($ch){    if ($ch == 'a' || $ch == 'e' ||        $ch == 'i' || $ch == 'o' || $ch == 'u')        return true;    return false;} // function to find the length of longest common// subsequence which contains all vowel charactersfunction lcs($X, $Y, $m, $n){    $L = array_fill(0, $m + 1, array_fill(0, $n + 1, NULL));     // Following steps build L[m+1][n+1] in bottom    // up fashion. Note that L[i][j] contains length    // of LCS of X[0..i-1] and Y[0..j-1]    for ($i = 0; $i <= $m; $i++)    {        for ($j = 0; $j <= $n; $j++)        {            if ($i == 0 || $j == 0)                $L[$i][$j] = 0;             else if (($X[$i - 1] == $Y[$j - 1]) &&                            isVowel($X[$i - 1]))                $L[$i][$j] = $L[$i - 1][$j - 1] + 1;             else                $L[$i][$j] = max($L[$i - 1][$j],                                 $L[$i][$j - 1]);        }    }     // L[m][n] contains length of LCS for X[0..n-1]    // and Y[0..m-1] which contains all vowel characters    return $L[$m][$n];} // Driver Code$X = "aieef";$Y = "klaief"; $m = strlen($X);$n = strlen($Y); echo "Length of LCS = " . lcs($X, $Y, $m, $n); // This code is contributed by ita_c?>
<script> // Javascript implementation to find the// length of longest common subsequence// which contains all vowel characters // Function to check whether 'ch'// is a vowel or notfunction isVowel(ch){    if (ch == 'a' || ch == 'e' ||        ch == 'i' || ch == 'o' ||        ch == 'u')        return true;             return false;} // Function to find the length of// longest common subsequence which// contains all vowel charactersfunction lcs(X, Y, m, n){    let L = new Array(m + 1);    let i, j;       // Following steps build L[m+1][n+1]    // in bottom up fashion. Note that    // L[i][j] contains length of LCS of    // X[0..i-1] and Y[0..j-1]    for(i = 0; i <= m; i++)    {        L[i] = new Array(n + 1);        for(j = 0; j <= n; j++)        {            if (i == 0 || j == 0)                L[i][j] = 0;               else if ((X[i - 1] == Y[j - 1]) &&                          isVowel(X[i - 1]))                L[i][j] = L[i - 1][j - 1] + 1;               else                L[i][j] = Math.max(L[i - 1][j],                                L[i][j - 1]);        }    }       // L[m][n] contains length of LCS    // for X[0..n-1] and Y[0..m-1]    // which contains all vowel characters    return L[m][n];} // Driver Codelet X = "aieef";let Y = "klaief";let m = X.length;let n = Y.length; document.write("Length of LCS = " + lcs(X, Y, m, n)); // This code is contributed by avanitrachhadiya2155 </script>
Length of LCS = 3
 
Time Complexity: O(m*n). Auxiliary Space: O(m*n). 
bilal-hungund
andrew1234
ukasp
mohit kumar 29
avanitrachhadiya2155
LCS
subsequence
vowel-consonant
Dynamic Programming
Strings
Strings
Dynamic Programming
LCS
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.