Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Interview Problems on DP
  • Practice DP
  • MCQs on DP
  • Tutorial on Dynamic Programming
  • Optimal Substructure
  • Overlapping Subproblem
  • Memoization
  • Tabulation
  • Tabulation vs Memoization
  • 0/1 Knapsack
  • Unbounded Knapsack
  • Subset Sum
  • LCS
  • LIS
  • Coin Change
  • Word Break
  • Egg Dropping Puzzle
  • Matrix Chain Multiplication
  • Palindrome Partitioning
  • DP on Arrays
  • DP with Bitmasking
  • Digit DP
  • DP on Trees
  • DP on Graph
Open In App
Next Article:
Length of longest common prime subsequence from two given arrays
Next article icon

Find length of longest subsequence of one string which is substring of another string

Last Updated : 03 Feb, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

Given two strings X and Y. The task is to find the length of the longest subsequence of string X which is a substring in sequence Y.

Examples: 

Input : X = “ABCD”, Y = “BACDBDCD”
Output : 3
Explanation: “ACD” is longest subsequence of X which is substring of Y.

Input : X = “A”, Y = “A”
Output : 1

Perquisites: Longest common subsequence problem will help you understand this problem in a snap. 

Using Recursion – O(n*m) Time and O(n) Space

Let n be the length of X and m be the length of Y. We will make a recursive function as follows with 4 arguments and the return type is int as we will get the length of a maximum possible subsequence of X which is the Substring of Y. We will take judgment for further process based on the last char in strings by using n-1 and m-1.

For recursion we need 2 things, we will make 1st the base case and 2nd is calls on smaller input (for that we will see the choice diagram). 

Base Case:

By seeing the argument of function we can see only 2 arguments that will change while recursion calls, i.e. lengths of both strings. So for the base case think of the smallest input we can give. You’ll see the smallest input is 0, i.e. empty lengths. hence when n == 0 or m == 0 is the base case. n and m can’t be less than zero. Now we know the condition and we need to return the length of subsequence as per the question. if the length is 0, then means one of the string is empty, and there is no common subsequence possible, so we have to return 0 for the same.

Children Calls:

Choice Diagram

We can see how to make calls by seeing if the last char of both strings are the same or not. We can see how this is slightly different from the LCS (Longest Common Subsequence) question.

int maxSubsequenceSubstring(string &X,string &Y,int n,int m) {

// Base Case
if (n==0 || m==0) return 0;

// Calls on smaller inputs
// if the last char of both strings are equal

if(X[n-1] == Y[m-1]) {

return 1 + maxSubsequenceSubstring(X,Y,n-1,m-1);

}

// if the last char of both strings are not equal
else {

return maxSubsequenceSubstring(X,Y,n-1,m);

}

}

Now here is the main crux of the question, we can see we are calling for X[0..n] and Y[0..m], in our recursion function it will return the answer of maximum length of the subsequence of X, and Substring of Y (and the ending char of that substring of Y ends at length m). This is very important as we want to find all intermediary substrings also. hence we need to use a for loop where we will call the above function for all the lengths from 0 to m of Y, and return the maximum of the answer there. Here is the final code in C++ for the same.

Below is the implementation of the above approach:

C++
#include<bits/stdc++.h> using namespace std;  int maxSubsequenceSubstring(string &X,string &Y,int n,int m) {     // Base Case     if (n==0 || m==0) return 0;          // Calls on smaller inputs          // if the last char of both strings are equal     if(X[n-1] == Y[m-1])     {         return  1 + maxSubsequenceSubstring(X,Y,n-1,m-1);     }          // if the last char of both strings are not equal     else     {         return maxSubsequenceSubstring(X,Y,n-1,m);         } }  int main() {      string X = "abcd";       string Y = "bacdbdcd";       int n = X.size(),m = Y.size();       int maximum_length = 0; //as minimum length can be 0 only.       for(int i = 0;i<=m;i++) // traversing for every length of Y.     {         int temp_ans = maxSubsequenceSubstring(X,Y,n,i);           if(temp_ans > maximum_length) maximum_length = temp_ans;     }       cout<<"Length for maximum possible Subsequence of string X which is Substring of Y -> "<<maximum_length;       return 0; } 
Java
import java.util.*; class GFG {      static int maxSubsequenceSubString(String X, String Y,                                        int n, int m)     {                // Base Case         if (n == 0 || m == 0)             return 0;          // Calls on smaller inputs          // if the last char of both Strings are equal         if (X.charAt(n - 1) == Y.charAt(m - 1)) {             return 1                 + maxSubsequenceSubString(X, Y, n - 1,                                           m - 1);         }          // if the last char of both Strings are not equal         else {             return maxSubsequenceSubString(X, Y, n - 1, m);         }     }    // Driver code     public static void main(String[] args)     {         String X = "abcd";         String Y = "bacdbdcd";         int n = X.length(), m = Y.length();         int maximum_length             = 0; // as minimum length can be 0 only.         for (int i = 0; i <= m;              i++) // traversing for every length of Y.         {             int temp_ans                 = maxSubsequenceSubString(X, Y, n, i);             if (temp_ans > maximum_length)                 maximum_length = temp_ans;         }         System.out.print(             "Length for maximum possible Subsequence of String X which is SubString of Y->"             + maximum_length);     } } 
Python
def maxSubsequenceSubstring(X, Y, n, m):      # Base Case     if (n == 0 or m == 0):         return 0          # Calls on smaller inputs          # if the last char of both strings are equal     if(X[n - 1] == Y[m - 1]):         return 1 + maxSubsequenceSubstring(X, Y, n - 1, m - 1)          # if the last char of both strings are not equal     else:         return maxSubsequenceSubstring(X, Y, n - 1, m)  # driver code X = "abcd" Y = "bacdbdcd" n, m = len(X), len(Y) maximum_length = 0 #as minimum length can be 0 only. for i in range(m + 1):# traversing for every length of Y.      temp_ans = maxSubsequenceSubstring(X, Y, n, i)     if(temp_ans > maximum_length):          maximum_length = temp_ans  print(f"Length for maximum possible Subsequence of string X which is Substring of Y -> {maximum_length}") 
C#
using System;  public class GFG {      static int maxSubsequenceSubString(String X, String Y,                                        int n, int m)     {          // Base Case         if (n == 0 || m == 0)             return 0;          // Calls on smaller inputs          // if the last char of both Strings are equal         if (X[n - 1] == Y[m - 1]) {             return 1                 + maxSubsequenceSubString(X, Y, n - 1,                                           m - 1);         }          // if the last char of both Strings are not equal         else {             return maxSubsequenceSubString(X, Y, n - 1, m);         }     }      // Driver code     public static void Main(String[] args)     {         String X = "abcd";         String Y = "bacdbdcd";         int n = X.Length, m = Y.Length;         int maximum_length             = 0; // as minimum length can be 0 only.         for (int i = 0; i <= m;              i++) // traversing for every length of Y.         {             int temp_ans                 = maxSubsequenceSubString(X, Y, n, i);             if (temp_ans > maximum_length)                 maximum_length = temp_ans;         }         Console.Write(             "Length for maximum possible Subsequence of String X which is SubString of Y->"             + maximum_length);     } } 
JavaScript
<script>  function maxSubsequenceSubstring(X,Y,n,m) {     // Base Case     if (n==0 || m==0) return 0;          // Calls on smaller inputs          // if the last char of both strings are equal     if(X[n-1] == Y[m-1])     {         return 1 + maxSubsequenceSubstring(X,Y,n-1,m-1);     }          // if the last char of both strings are not equal     else     {         return maxSubsequenceSubstring(X,Y,n-1,m);     } }  // driver code  let X = "abcd"; let Y = "bacdbdcd"; let n = X.length,m = Y.length; let maximum_length = 0; //as minimum length can be 0 only. for(let i = 0;i<=m;i++) // traversing for every length of Y. {     let temp_ans = maxSubsequenceSubstring(X,Y,n,i);     if(temp_ans > maximum_length) maximum_length = temp_ans; } document.write("Length for maximum possible Subsequence of string X which is Substring of Y -> "+ maximum_length);  </script> 

Output
Length for maximum possible Subsequence of string X which is Substring of Y -> 3

Time Complexity: O(n*m) (For every call in the recursion function we are decreasing n, hence we will reach the base case exactly after n calls, and we are using for loop for m times for the different lengths of string Y).
Space Complexity: O(n) (For recursion calls we are using stacks for each call).

Using Top-Down DP (Memoization) –                                                                                                                                                                        

From the above recursion solution, there are multiple calls and further, we are using recursion in for loop, there is a high probability we have already solved the answer for a call. hence to optimize our recursion solution we will use? (See we have only 2 arguments that vary throughout the calls, hence the dimension of the array is 2 and the size is (n+1) * (m+1) because we need to store answers for all possible calls from 0..n and 0..m). Hence it is a 2D array.

we can use vectors for the same or dynamic allocation of the array.

// initialise a vector like this

vector<vector<int>> dp(n+1,vector<int>(m+1,-1));

// or Dynamic allocation

int **dp = new int*[n+1];

for(int i = 0;i<=n;i++)

{

dp[i] = new int[m+1];

for(int j = 0;j<=m;j++)

{

dp[i][j] = -1;

}

}

By initializing the 2D vector we will use this array as the 5th argument in recursion and store our answer. also, we have filled it with -1, which means we have not solved this call hence use traditional recursion for it, if dp[n][m] at any call is not -1, means we have already solved the call, hence use the answer of dp[n][m].

// In recursion calls we will check for if we have solved the answer for the call or not

if(dp[n][m] != -1) return dp[n][m];

// Else we will store the result and return that back from this call

if(X[n-1] == Y[m-1])

return dp[n][m] = 1 + maxSubsequenceSubstring(X,Y,n-1,m-1,dp);

else

return dp[n][m] = maxSubsequenceSubstring(X,Y,n-1,m,dp);

Below is the implementation of the above approach:

C++
#include<bits/stdc++.h> using namespace std;  int maxSubsequenceSubstring(string &X,string &Y,int n,int m,vector<vector<int>>& dp) {     // Base Case     if (n==0 || m==0) return 0;            // check if we have already solved it?       if(dp[n][m] != -1) return dp[n][m];               // Calls on smaller inputs          // if the last char of both strings are equal     if(X[n-1] == Y[m-1])     {         return  dp[n][m] = 1 + maxSubsequenceSubstring(X,Y,n-1,m-1,dp);     }          // if the last char of both strings are not equal     else     {         return dp[n][m] = maxSubsequenceSubstring(X,Y,n-1,m,dp);         } }  int main() {      string X = "abcd";       string Y = "bacdbdcd";       int n = X.size(),m = Y.size();       int maximum_length = 0; //as minimum length can be 0 only.          vector<vector<int>> dp(n+1,vector<int>(m+1,-1));       for(int i = 0;i<=m;i++) // traversing for every length of Y.     {         int temp_ans = maxSubsequenceSubstring(X,Y,n,i,dp);           if(temp_ans > maximum_length) maximum_length = temp_ans;     }       cout<<"Length for maximum possible Subsequence of string X which is Substring of Y -> "<<maximum_length;       return 0; } 
Java
/*package whatever //do not write package name here */  import java.io.*; import java.util.*;  class GFG {     static int maxSubsequenceSubstring(String X,String Y,int n,int m,int dp[][])     {         // Base Case         if (n==0 || m==0) return 0;                  // check if we have already solved it?         if(dp[n][m] != -1) return dp[n][m];                       // Calls on smaller inputs                  // if the last char of both strings are equal         if(X.charAt(n-1) == Y.charAt(m-1))         {             return dp[n][m] = 1 + maxSubsequenceSubstring(X,Y,n-1,m-1,dp);         }                  // if the last char of both strings are not equal         else         {             return dp[n][m] = maxSubsequenceSubstring(X,Y,n-1,m,dp);         }     }      // Driver Code public static void main(String args[]) {     String X = "abcd";     String Y = "bacdbdcd";     int n = X.length(),m = Y.length();     int maximum_length = 0; //as minimum length can be 0 only.          int dp[][] = new int[n+1][m+1];     for(int i = 0; i < n + 1; i++){         Arrays.fill(dp[i], -1);     }     for(int i = 0;i<=m;i++) // traversing for every length of Y.     {         int temp_ans = maxSubsequenceSubstring(X,Y,n,i,dp);         if(temp_ans > maximum_length) maximum_length = temp_ans;     }     System.out.println("Length for maximum possible Subsequence of string X which is Substring of Y -> "+maximum_length); } } 
Python
# Python implementation of above approach def maxSubsequenceSubstring(X, Y, n, m, dp):        # Base Case     if (n == 0 or m == 0):         return 0          # check if we have already solved it?     if(dp[n][m] != -1):         return dp[n][m]        # Calls on smaller inputs          # if the last char of both strings are equal     if(X[n - 1] == Y[m - 1]):         dp[n][m] = 1 + maxSubsequenceSubstring(X, Y, n - 1, m - 1, dp)         return dp[n][m]      # if the last char of both strings are not equal     else:         dp[n][m] = maxSubsequenceSubstring(X, Y, n - 1, m, dp)         return dp[n][m]  # driver code X = "abcd" Y = "bacdbdcd" n,m = len(X),len(Y) maximum_length = 0 #as minimum length can be 0 only.    dp = [[-1 for i in range(m+1)]for j in range(n+1)]  for i in range(m+1): # traversing for every length of Y.      temp_ans = maxSubsequenceSubstring(X, Y, n, i, dp)     if(temp_ans > maximum_length):         maximum_length = temp_ans  print("Length for maximum possible Subsequence of string X which is Substring of Y -> "+str(maximum_length)) 
C#
// C# code for the above approach using System;  class GFG {   static int maxSubsequenceSubstring(string X, string Y, int n, int m, int[,] dp)   {     // Base Case     if (n == 0 || m == 0) return 0;      // check if we have already solved it?     if (dp[n, m] != -1) return dp[n, m];      // Calls on smaller inputs      // if the last char of both strings are equal     if (X[n - 1] == Y[m - 1])     {       return dp[n, m] = 1 + maxSubsequenceSubstring(X, Y, n - 1, m - 1, dp);     }      // if the last char of both strings are not equal     else     {       return dp[n, m] = maxSubsequenceSubstring(X, Y, n - 1, m, dp);     }   }    // Driver Code   public static void Main(string[] args)   {     string X = "abcd";     string Y = "bacdbdcd";     int n = X.Length, m = Y.Length;     int maximum_length = 0; //as minimum length can be 0 only.      int[,] dp = new int[n + 1, m + 1];     for (int i = 0; i < n + 1; i++)     {       for (int j = 0; j < m + 1; j++)       {         dp[i, j] = -1;       }     }     for (int i = 0; i <= m; i++) // traversing for every length of Y.     {       int temp_ans = maxSubsequenceSubstring(X, Y, n, i, dp);       if (temp_ans > maximum_length) maximum_length = temp_ans;     }     Console.WriteLine("Length for maximum possible Subsequence of string X which is Substring of Y -> " + maximum_length);   } } 
JavaScript
<script>  // JavaScript implementation of above approach   function maxSubsequenceSubstring(X,Y,n,m,dp) {     // Base Case     if (n==0 || m==0) return 0;            // check if we have already solved it?       if(dp[n][m] != -1) return dp[n][m];               // Calls on smaller inputs          // if the last char of both strings are equal     if(X[n-1] == Y[m-1])     {         return  dp[n][m] = 1 + maxSubsequenceSubstring(X,Y,n-1,m-1,dp);     }          // if the last char of both strings are not equal     else     {         return dp[n][m] = maxSubsequenceSubstring(X,Y,n-1,m,dp);         } }  // driver code  let X = "abcd"; let Y = "bacdbdcd"; let n = X.length,m = Y.length; let maximum_length = 0; //as minimum length can be 0 only.    let dp = new Array(n+1); for(let i=0;i<n+1;i++){     dp[i] = new Array(m+1).fill(-1); } for(let i = 0;i<=m;i++) // traversing for every length of Y. {     let temp_ans = maxSubsequenceSubstring(X,Y,n,i,dp);     if(temp_ans > maximum_length) maximum_length = temp_ans; } document.write("Length for maximum possible Subsequence of string X which is Substring of Y -> ",maximum_length);   </script> 

Output
Length for maximum possible Subsequence of string X which is Substring of Y -> 3

Time Complexity: O(n*m) (It will be definitely better than the recursion solution, the worst case is possible only possible when none of the char of string X is there in String Y.)
Space Complexity: O(n*m + n) (the Size of Dp array and stack call size of recursion)

Using Bottom-Up DP (Tabulation) – O(n*m) Time and O(n*m + m) Space

Let n be length of X and m be length of Y. Create a 2D array ‘dp[][]’ of m + 1 rows and n + 1 columns. Value dp[i][j] is maximum length of subsequence of X[0….j] which is substring of Y[0….i]. Now for each cell of dp[][] fill value as : 

for (i = 1 to m)

for (j = 1 to n)

if (x[j-1] == y[i – 1])

dp[i][j] = dp[i-1][j-1] + 1;

else

dp[i][j] = dp[i][j-1];

And finally, the length of the longest subsequence of x which is substring of y is max(dp[i][n]) where 1 <= i <= m.

Below is the implementation of the above approach:

C++
// C++ code to implement the approach #include <bits/stdc++.h> using namespace std;  const int MAX = 1000;  // Return the maximum size of substring of // X which is substring in Y. int maxSubsequenceSubstring(string x,string y,int n,int m) {     vector<vector<int>>dp(MAX,vector<int>(MAX,0));      // Calculating value for each element.     for (int i = 1; i <= m; i++) {         for (int j = 1; j <= n; j++) {              // If alphabet of string X and Y are             // equal make dp[i][j] = 1 + dp[i-1][j-1]             if (x[j - 1] == y[i - 1])                 dp[i][j] = 1 + dp[i - 1][j - 1];              // Else copy the previous value in the             // row i.e dp[i-1][j-1]             else                 dp[i][j] = dp[i][j - 1];         }     }      // Finding the maximum length.     int ans = 0;     for (int i = 1; i <= m; i++)         ans = max(ans, dp[i][n]);      return ans; }  // Driver code int main() {     string x = "ABCD";     string y = "BACDBDCD";     int n = x.length(), m = y.length();     cout<<maxSubsequenceSubstring(x, y, n, m); } 
Java
// Java program to find maximum length of // subsequence of a string X such it is // substring in another string Y.  public class GFG  {     static final int MAX = 1000;          // Return the maximum size of substring of     // X which is substring in Y.     static int maxSubsequenceSubstring(char x[], char y[],                                 int n, int m)     {         int dp[][] = new int[MAX][MAX];               // Initialize the dp[][] to 0.         for (int i = 0; i <= m; i++)             for (int j = 0; j <= n; j++)                 dp[i][j] = 0;               // Calculating value for each element.         for (int i = 1; i <= m; i++) {             for (int j = 1; j <= n; j++) {                       // If alphabet of string X and Y are                 // equal make dp[i][j] = 1 + dp[i-1][j-1]                 if (x[j - 1] == y[i - 1])                     dp[i][j] = 1 + dp[i - 1][j - 1];                       // Else copy the previous value in the                 // row i.e dp[i-1][j-1]                 else                     dp[i][j] = dp[i][j - 1];             }         }               // Finding the maximum length.         int ans = 0;         for (int i = 1; i <= m; i++)             ans = Math.max(ans, dp[i][n]);               return ans;     }          // Driver Method     public static void main(String[] args)     {         char x[] = "ABCD".toCharArray();         char y[] = "BACDBDCD".toCharArray();         int n = x.length, m = y.length;         System.out.println(maxSubsequenceSubstring(x, y, n, m));     } } 
Python
# Python3 program to find maximum  # length of subsequence of a string # X such it is substring in another # string Y.   MAX = 1000  # Return the maximum size of  # substring of X which is # substring in Y. def maxSubsequenceSubstring(x, y, n, m):     dp = [[0 for i in range(MAX)]              for i in range(MAX)]                   # Initialize the dp[][] to 0.      # Calculating value for each element.     for i in range(1, m + 1):         for j in range(1, n + 1):                          # If alphabet of string              # X and Y are equal make              # dp[i][j] = 1 + dp[i-1][j-1]             if(x[j - 1] == y[i - 1]):                 dp[i][j] = 1 + dp[i - 1][j - 1]              # Else copy the previous value              # in the row i.e dp[i-1][j-1]             else:                 dp[i][j] = dp[i][j - 1]                      # Finding the maximum length     ans = 0     for i in range(1, m + 1):         ans = max(ans, dp[i][n])     return ans  # Driver Code  x = "ABCD" y = "BACDBDCD" n = len(x) m = len(y) print(maxSubsequenceSubstring(x, y, n, m)) 
C#
// C# program to find maximum length of // subsequence of a string X such it is // substring in another string Y. using System;  public class GFG  {     static int MAX = 1000;          // Return the maximum size of substring of     // X which is substring in Y.     static int maxSubsequenceSubstring(string x, string y,                                             int n, int m)     {         int[ ,]dp = new int[MAX, MAX];              // Initialize the dp[][] to 0.         for (int i = 0; i <= m; i++)             for (int j = 0; j <= n; j++)                 dp[i, j] = 0;              // Calculating value for each element.         for (int i = 1; i <= m; i++) {             for (int j = 1; j <= n; j++) {                      // If alphabet of string X and Y are                 // equal make dp[i][j] = 1 + dp[i-1][j-1]                 if (x[j - 1] == y[i - 1])                     dp[i, j] = 1 + dp[i - 1, j - 1];                      // Else copy the previous value in the                 // row i.e dp[i-1][j-1]                 else                     dp[i, j] = dp[i, j - 1];             }         }              // Finding the maximum length.         int ans = 0;                  for (int i = 1; i <= m; i++)             ans = Math.Max(ans, dp[i,n]);              return ans;     }          // Driver Method     public static void Main()     {         string x = "ABCD";         string y = "BACDBDCD";         int n = x.Length, m = y.Length;                  Console.WriteLine(maxSubsequenceSubstring(x,                                             y, n, m));     } } 
JavaScript
<script>   // Javascript program to find maximum length of // subsequence of a string X such it is // substring in another string Y. var MAX = 1000;  // Return the maximum size of substring of // X which is substring in Y. function maxSubsequenceSubstring(x, y, n, m) {     var dp = Array.from(Array(MAX), ()=> Array(MAX));      // Initialize the dp[][] to 0.     for (var i = 0; i <= m; i++)         for (var j = 0; j <= n; j++)             dp[i][j] = 0;      // Calculating value for each element.     for (var i = 1; i <= m; i++) {         for (var j = 1; j <= n; j++) {              // If alphabet of string X and Y are             // equal make dp[i][j] = 1 + dp[i-1][j-1]             if (x[j - 1] == y[i - 1])                 dp[i][j] = 1 + dp[i - 1][j - 1];              // Else copy the previous value in the             // row i.e dp[i-1][j-1]             else                 dp[i][j] = dp[i][j - 1];         }     }      // Finding the maximum length.     var ans = 0;     for (var i = 1; i <= m; i++)         ans = Math.max(ans, dp[i][n]);      return ans; }  // Driver Program var x = "ABCD"; var y = "BACDBDCD"; var n = x.length, m = y.length; document.write( maxSubsequenceSubstring(x, y, n, m));  </script> 

Output
3

Time Complexity: O(n*m), due to time required to fill the Dp array
Space Complexity: O(n*m + n), due the Size of Dp array

Greedy Approach – O(n*m) Time and O(1) Space

The idea is to use two pointers: one traverses Y and the other traverses X. For each position in Y, the inner loop checks if characters in X can match consecutively, and the length of the match is tracked. The maximum length of such consecutive matches is returned as the result.

Below is the implementation of the above approach:

C++
#include<bits/stdc++.h> using namespace std;  // Function to find the maximum subsequence substring length int maxSubsequenceSubstring(string X, string Y, int N, int M) {        // Initialize a variable to keep track of the maximum length     int maxi = 0;          // Outer loop to traverse through each character of Y     for (int i = 0; i < M; i++) {         int t = i; // Initialize a pointer 't' to track position in Y                  // Inner loop to traverse through each character of X         for (int j = 0; j < N; j++) {                          // If characters from X and Y match, move pointer 't' in Y             if (Y[t] == X[j]) {                 t++;             }                          // Update the maximum length found so far             maxi = max(maxi, t - i);         }     }          // Return the maximum length of the subsequence substring     return maxi; }  int main() {        // Hardcoded input values     int N = 4, M = 8;     string X = "abcd";     string Y = "bacdbdcd";          // Call the function and store the result     int result = maxSubsequenceSubstring(X, Y, N, M);          // Print the result     cout << "Maximum subsequence substring length: " << result << endl;          return 0; } 
Java
class GfG {        // Function to find the maximum subsequence substring length     public static int maxSubsequenceSubstring(String X, String Y, int N, int M) {                // Initialize a variable to keep track of the maximum length         int maxi = 0;          // Outer loop to traverse through each character of Y         for (int i = 0; i < M; i++) {             int t = i; // Initialize a pointer 't' to track position in Y              // Inner loop to traverse through each character of X             for (int j = 0; j < N; j++) {                 // If characters from X and Y match, move pointer 't' in Y                 if (Y.charAt(t) == X.charAt(j)) {                     t++;                 }                  // Update the maximum length found so far                 maxi = Math.max(maxi, t - i);             }         }          // Return the maximum length of the subsequence substring         return maxi;     }      // Driver code     public static void main(String[] args) {                // Hardcoded input values         int N = 4, M = 8;         String X = "abcd";         String Y = "bacdbdcd";          // Call the function and store the result         int result = maxSubsequenceSubstring(X, Y, N, M);          // Print the result         System.out.println("Maximum subsequence substring length: " + result);     } } 
Python
def maxSubsequenceSubstring(X, Y, N, M):     # Initialize a variable to keep track of the maximum length     maxi = 0          # Outer loop to traverse through each character of Y     for i in range(M):         t = i  # Initialize a pointer 't' to track position in Y          # Inner loop to traverse through each character of X         for j in range(N):             # If characters from X and Y match, move pointer 't' in Y             if Y[t] == X[j]:                 t += 1                          # Update the maximum length found so far             maxi = max(maxi, t - i)          # Return the maximum length of the subsequence substring     return maxi   def main():     # Hardcoded input values     N = 4     M = 8     X = "abcd"     Y = "bacdbdcd"          # Call the function and store the result     result = maxSubsequenceSubstring(X, Y, N, M)          # Print the result     print(f"Maximum subsequence substring length: {result}")   # Driver code if __name__ == "__main__":     main() 
C#
using System;  class GfG {     // Function to find the maximum subsequence substring length     public static int MaxSubsequenceSubstring(string X, string Y, int N, int M) {         // Initialize a variable to keep track of the maximum length         int maxi = 0;          // Outer loop to traverse through each character of Y         for (int i = 0; i < M; i++) {             int t = i; // Initialize a pointer 't' to track position in Y              // Inner loop to traverse through each character of X             for (int j = 0; j < N; j++) {                 // If characters from X and Y match, move pointer 't' in Y                 if (Y[t] == X[j]) {                     t++;                 }                  // Update the maximum length found so far                 maxi = Math.Max(maxi, t - i);             }         }          // Return the maximum length of the subsequence substring         return maxi;     }      // Driver code     public static void Main(string[] args) {         // Hardcoded input values         int N = 4, M = 8;         string X = "abcd";         string Y = "bacdbdcd";          // Call the function and store the result         int result = MaxSubsequenceSubstring(X, Y, N, M);          // Print the result         Console.WriteLine("Maximum subsequence substring length: " + result);     } } 
JavaScript
function maxSubsequenceSubstring(X, Y, N, M) {     // Initialize a variable to keep track of the maximum length     let maxi = 0;          // Outer loop to traverse through each character of Y     for (let i = 0; i < M; i++) {         let t = i;  // Initialize a pointer 't' to track position in Y          // Inner loop to traverse through each character of X         for (let j = 0; j < N; j++) {             // If characters from X and Y match, move pointer 't' in Y             if (Y[t] === X[j]) {                 t++;             }                          // Update the maximum length found so far             maxi = Math.max(maxi, t - i);         }     }          // Return the maximum length of the subsequence substring     return maxi; }  // Hardcoded input values const N = 4; const M = 8; const X = "abcd"; const Y = "bacdbdcd";  // Call the function and store the result const result = maxSubsequenceSubstring(X, Y, N, M);  // Print the result console.log("Maximum subsequence substring length:", result); 

Time Complexity: O(n * m), where n and m represent the lengths of the strings X and Y, respectively.
Space Complexity: O(1), as the solution uses only a constant amount of extra space.

 



Next Article
Length of longest common prime subsequence from two given arrays
https://media.geeksforgeeks.org/auth/avatar.png
GeeksforGeeks
Improve
Article Tags :
  • DSA
  • Dynamic Programming
  • Strings
Practice Tags :
  • Dynamic Programming
  • Strings

Similar Reads

  • Longest Common Subsequence (LCS)
    Given two strings, s1 and s2, the task is to find the length of the Longest Common Subsequence. If there is no common subsequence, return 0. A subsequence is a string generated from the original string by deleting 0 or more characters, without changing the relative order of the remaining characters.
    15+ min read
  • Printing Longest Common Subsequence
    Given two sequences, print the longest subsequence present in both of them. Examples: LCS for input Sequences “ABCDGH” and “AEDFHR” is “ADH” of length 3. LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4.We have discussed Longest Common Subsequence (LCS) problem in a previous post
    15+ min read
  • Longest Common Subsequence | DP using Memoization
    Given two strings s1 and s2, the task is to find the length of the longest common subsequence present in both of them. Examples: Input: s1 = “ABCDGH”, s2 = “AEDFHR” Output: 3 LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4. Input: s1 = “striver”, s2 = “raj” Output: 1 The naive s
    13 min read
  • Longest Common Increasing Subsequence (LCS + LIS)
    Given two arrays, a[] and b[], find the length of the longest common increasing subsequence(LCIS). LCIS refers to a subsequence that is present in both arrays and strictly increases.Prerequisites: LCS, LIS. Examples: Input: a[] = [3, 4, 9, 1], b[] = [5, 3, 8, 9, 10, 2, 1]Output: 2Explanation: The lo
    15+ min read
  • LCS (Longest Common Subsequence) of three strings
    Given 3 strings say s1, s2 and s3. The task is to find the longest common sub-sequence in all three given sequences. Examples: Input: s1 = "geeks" , s2 = "geeksfor", s3 = "geeksforgeeks"Output : 5Explanation: Longest common subsequence is "geeks" i.e., length = 5Input: s1= "abcd1e2" , s2= "bc12ea" ,
    15+ min read
  • C++ Program for Longest Common Subsequence
    LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So
    3 min read
  • Java Program for Longest Common Subsequence
    LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So
    4 min read
  • Python Program for Longest Common Subsequence
    LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So
    3 min read
  • Problems on LCS

    • Edit distance and LCS (Longest Common Subsequence)
      In standard Edit Distance where we are allowed 3 operations, insert, delete, and replace. Consider a variation of edit distance where we are allowed only two operations insert and delete, find edit distance in this variation. Examples: Input : str1 = "cat", st2 = "cut"Output : 2We are allowed to ins
      6 min read

    • Length of longest common subsequence containing vowels
      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 : aieInput : X = "geeksforgeeks" Y = "feroeeks"Output : eoeeSource:Pa
      14 min read

    • Longest Common Subsequence (LCS) by repeatedly swapping characters of a string with characters of another string
      Given two strings A and B of lengths N and M respectively, the task is to find the length of the longest common subsequence that can be two strings if any character from string A can be swapped with any other character from B any number of times. Examples: Input: A = "abdeff", B = "abbet"Output: 4Ex
      7 min read

    • Longest Common Subsequence with at most k changes allowed
      Given two sequence P and Q of numbers. The task is to find Longest Common Subsequence of two sequences if we are allowed to change at most k element in first sequence to any value. Examples: Input : P = { 8, 3 } Q = { 1, 3 } K = 1 Output : 2 If we change first element of first sequence from 8 to 1,
      8 min read

    • Minimum cost to make Longest Common Subsequence of length k
      Given two string X, Y and an integer k. Now the task is to convert string X with the minimum cost such that the Longest Common Subsequence of X and Y after conversion is of length k. The cost of conversion is calculated as XOR of old character value and new character value. The character value of 'a
      14 min read

    • Longest Common Substring
      Given two strings 's1' and 's2', find the length of the longest common substring. Example: Input: s1 = "GeeksforGeeks", s2 = "GeeksQuiz" Output : 5 Explanation:The longest common substring is "Geeks" and is of length 5. Input: s1 = "abcdxyz", s2 = "xyzabcd" Output : 4Explanation:The longest common s
      15+ min read

    • Longest Common Subsequence of two arrays out of which one array consists of distinct elements only
      Given two arrays firstArr[], consisting of distinct elements only, and secondArr[], the task is to find the length of LCS between these 2 arrays. Examples: Input: firstArr[] = {3, 5, 1, 8}, secondArr[] = {3, 3, 5, 3, 8}Output: 3.Explanation: LCS between these two arrays is {3, 5, 8}. Input : firstAr
      7 min read

    • Longest Repeating Subsequence
      Given a string s, the task is to find the length of the longest repeating subsequence, such that the two subsequences don't have the same string character at the same position, i.e. any ith character in the two subsequences shouldn't have the same index in the original string. Examples: Input: s= "a
      15+ min read

    • Longest Common Anagram Subsequence
      Given two strings str1 and str2 of length n1 and n2 respectively. The problem is to find the length of the longest subsequence which is present in both the strings in the form of anagrams. Note: The strings contain only lowercase letters. Examples: Input : str1 = "abdacp", str2 = "ckamb" Output : 3
      7 min read

    • Length of Longest Common Subsequence with given sum K
      Given two arrays a[] and b[] and an integer K, the task is to find the length of the longest common subsequence such that sum of elements is equal to K. Examples: Input: a[] = { 9, 11, 2, 1, 6, 2, 7}, b[] = {1, 2, 6, 9, 2, 3, 11, 7}, K = 18Output: 3Explanation: Subsequence { 11, 7 } and { 9, 2, 7 }
      15+ min read

    • Longest Common Subsequence with no repeating character
      Given two strings s1 and s2, the task is to find the length of the longest common subsequence with no repeating character. Examples: Input: s1= "aabbcc", s2= "aabc"Output: 3Explanation: "aabc" is longest common subsequence but it has two repeating character 'a'.So the required longest common subsequ
      10 min read

    • Find the Longest Common Subsequence (LCS) in given K permutations
      Given K permutations of numbers from 1 to N in a 2D array arr[][]. The task is to find the longest common subsequence of these K permutations. Examples: Input: N = 4, K = 3arr[][] = {{1, 4, 2, 3}, {4, 1, 2, 3}, {1, 2, 4, 3}}Output: 3Explanation: Longest common subsequence is {1, 2, 3} which has leng
      10 min read

    • Find length of longest subsequence of one string which is substring of another string
      Given two strings X and Y. The task is to find the length of the longest subsequence of string X which is a substring in sequence Y. Examples: Input : X = "ABCD", Y = "BACDBDCD"Output : 3Explanation: "ACD" is longest subsequence of X which is substring of Y. Input : X = "A", Y = "A"Output : 1 Perqui
      15+ min read

    • Length of longest common prime subsequence from two given arrays
      Given two arrays arr1[] and arr2[] of length N and M respectively, the task is to find the length of the longest common prime subsequence that can be obtained from the two given arrays. Examples: Input: arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, arr2[] = {2, 5, 6, 3, 7, 9, 8} Output: 4 Explanation: The l
      11 min read

    • A Space Optimized Solution of LCS
      Given two strings, s1 and s2, the task is to find the length of the Longest Common Subsequence. If there is no common subsequence, return 0. Examples: Input: s1 = “ABCDGH”, s2 = “AEDFHR”Output: 3Explanation: The longest subsequence present in both strings is "ADH". Input: s1 = “AGGTAB”, s2 = “GXTXAY
      13 min read

    • Longest common subarray in the given two arrays
      Given two arrays A[] and B[] of N and M integers respectively, the task is to find the maximum length of an equal subarray or the longest common subarray between the two given array. Examples: Input: A[] = {1, 2, 8, 2, 1}, B[] = {8, 2, 1, 4, 7} Output: 3 Explanation: The subarray that is common to b
      15+ min read

    • Number of ways to insert a character to increase the LCS by one
      Given two strings A and B. The task is to count the number of ways to insert a character in string A to increase the length of the Longest Common Subsequence between string A and string B by 1. Examples: Input : A = "aa", B = "baaa" Output : 4 The longest common subsequence shared by string A and st
      11 min read

    • Longest common subsequence with permutations allowed
      Given two strings in lowercase, find the longest string whose permutations are subsequences of given two strings. The output longest string must be sorted. Examples: Input : str1 = "pink", str2 = "kite" Output : "ik" The string "ik" is the longest sorted string whose one permutation "ik" is subseque
      7 min read

    • Longest subsequence such that adjacent elements have at least one common digit
      Given an array arr[], the task is to find the length of the longest sub-sequence such that adjacent elements of the subsequence have at least one digit in common. Examples: Input: arr[] = [1, 12, 44, 29, 33, 96, 89] Output: 5 Explanation: The longest sub-sequence is [1 12 29 96 89] Input: arr[] = [1
      15+ min read

    • Longest subsequence with different adjacent characters
      Given string str. The task is to find the longest subsequence of str such that all the characters adjacent to each other in the subsequence are different. Examples:   Input: str = "ababa" Output: 5 Explanation: "ababa" is the subsequence satisfying the condition Input: str = "xxxxy" Output: 2 Explan
      14 min read

    • Longest subsequence such that difference between adjacents is one
      Given an array arr[] of size n, the task is to find the longest subsequence such that the absolute difference between adjacent elements is 1. Examples: Input: arr[] = [10, 9, 4, 5, 4, 8, 6]Output: 3Explanation: The three possible subsequences of length 3 are [10, 9, 8], [4, 5, 4], and [4, 5, 6], whe
      15+ min read

    • Longest Uncommon Subsequence
      Given two strings, find the length of longest uncommon subsequence of the two strings. The longest uncommon subsequence is defined as the longest subsequence of one of these strings which is not a subsequence of other strings. Examples: Input : "abcd", "abc"Output : 4The longest subsequence is 4 bec
      12 min read

    • LCS formed by consecutive segments of at least length K
      Given two strings s1, s2 and K, find the length of the longest subsequence formed by consecutive segments of at least length K. Examples: Input : s1 = aggayxysdfa s2 = aggajxaaasdfa k = 4 Output : 8 Explanation: aggasdfa is the longest subsequence that can be formed by taking consecutive segments, m
      9 min read

    • Longest Increasing Subsequence using Longest Common Subsequence Algorithm
      Given an array arr[] of N integers, the task is to find and print the Longest Increasing Subsequence.Examples: Input: arr[] = {12, 34, 1, 5, 40, 80} Output: 4 {12, 34, 40, 80} and {1, 5, 40, 80} are the longest increasing subsequences.Input: arr[] = {10, 22, 9, 33, 21, 50, 41, 60, 80} Output: 6 Prer
      12 min read

geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences