Skip to content
geeksforgeeks
  • Tutorials
    • Python
    • Java
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
    • Practice Coding Problems
  • 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
  • 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:
Longest Common Anagram Subsequence
Next article icon

Longest Repeating Subsequence

Last Updated : 18 Nov, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

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= "abc"
Output: 0
Explanation: There is no repeating subsequence

Input: s= "aab"
Output: 1
Explanation: The two subsequence are 'a'(0th index) and 'a'(1th index). Note that 'b' cannot be considered as part of subsequence as it would be at same index in both.

Table of Content

  • Using Recursion - O(2^n) time and O(n) space
  • Using Top-Down DP (Memoization) – O(n^2) Time and O(n^2) Space
  • Using Bottom-Up DP (Tabulation) - O(n^2) Time and O(n^2) Space
  • Using Space Optimized DP - O(n^2) Time and O(n) Space

Using Recursion - O(2^n) time and O(n) space

This problem is a variation of the longest common subsequence (LCS) problem. The idea is to treat the given string as two separate strings and find the LCS between them. However, to ensure that the subsequences are not overlapping, we add the condition that no character in the subsequences should come from the same index in the original string. This means that when comparing two characters from the two strings, they must match, and their indices must be different. By leveraging this condition, we can adapt the LCS approach to solve for the longest repeating subsequence.

The idea is to compare the characters at index i and j of s and the indices i and j. Two cases arise:

1. If the characters of the string match (s[i-1] == s[j-1]) and their indices are different (i != j), then make a recursive call for the remaining string (i-1 and j-1) and add 1 to the result.

  • longestRepeatingSubsequence(i, j, s) = 1 + longestRepeatingSubsequence(i-1, j-1, s)

2. If the characters do not match or the indices are the same, make two recursive calls:

  • longestRepeatingSubsequence(i, j, str) = max(longestRepeatingSubsequence(i-1, j, str), longestRepeatingSubsequence(i, j-1, str))

Base Case:

  • If either of the strings becomes empty (i == 0 or j == 0), return 0.
C++
// C++ program to find longest // repeating subsequence using recursion  #include <bits/stdc++.h> using namespace std;  int findLongestRepeatingSubsequence(int i, int j, string &s) {      // base case     if (i == 0 || j == 0)         return 0;      // If characters match and their     // indices are different     if (s[i - 1] == s[j - 1] && i != j) {         return 1 + findLongestRepeatingSubsequence(i - 1, j - 1, s);     }      // Else make two recursive calls.     return max(findLongestRepeatingSubsequence(i - 1, j, s),                 findLongestRepeatingSubsequence(i, j - 1, s)); }  int longestRepeatingSubsequence(string s) {        int n = s.length();     return findLongestRepeatingSubsequence(n, n, s); }  int main() {        string s = "AABEBCDD";     int res = longestRepeatingSubsequence(s);     cout << res;      return 0; } 
Java
// Java program to find longest // repeating subsequence using recursion  class GfG {      static int findLongestRepeatingSubsequence(int i, int j,                                                String s) {         // base case         if (i == 0 || j == 0)             return 0;          // If characters match and their         // indices are different         if (s.charAt(i - 1) == s.charAt(j - 1) && i != j) {             return 1                 + findLongestRepeatingSubsequence(i - 1,                                                   j - 1, s);         }          // Else make two recursive calls.         return Math.max(             findLongestRepeatingSubsequence(i - 1, j, s),             findLongestRepeatingSubsequence(i, j - 1, s));     }      static int longestRepeatingSubsequence(String s) {                int n = s.length();         return findLongestRepeatingSubsequence(n, n, s);     }      public static void main(String[] args) {                String s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         System.out.println(res);     } } 
Python
# Python program to find longest # repeating subsequence using recursion     def findLongestRepeatingSubsequence(i, j, s):      # base case     if i == 0 or j == 0:         return 0      # If characters match and their     # indices are different     if s[i - 1] == s[j - 1] and i != j:         return 1 + findLongestRepeatingSubsequence(i - 1, j - 1, s)      # Else make two recursive calls.     return max(findLongestRepeatingSubsequence(i - 1, j, s),                findLongestRepeatingSubsequence(i, j - 1, s))   def longestRepeatingSubsequence(s):     n = len(s)     return findLongestRepeatingSubsequence(n, n, s)   if __name__ == "__main__":     s = "AABEBCDD"     res = longestRepeatingSubsequence(s)     print(res) 
C#
// C# program to find longest // repeating subsequence using recursion  using System;  class GfG {      static int findLongestRepeatingSubsequence(int i, int j,                                                string s) {          // base case         if (i == 0 || j == 0)             return 0;          // If characters match and their         // indices are different         if (s[i - 1] == s[j - 1] && i != j) {             return 1                 + findLongestRepeatingSubsequence(i - 1,                                                   j - 1, s);         }          // Else make two recursive calls.         return Math.Max(             findLongestRepeatingSubsequence(i - 1, j, s),             findLongestRepeatingSubsequence(i, j - 1, s));     }      static int longestRepeatingSubsequence(string s) {         int n = s.Length;         return findLongestRepeatingSubsequence(n, n, s);     }      static void Main(string[] args) {         string s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         Console.WriteLine(res);     } } 
JavaScript
// JavaScript program to find longest // repeating subsequence using recursion   function findLongestRepeatingSubsequence(i, j, s) {      // base case     if (i === 0 || j === 0)         return 0;      // If characters match and their     // indices are different     if (s[i - 1] === s[j - 1] && i !== j) {         return 1                + findLongestRepeatingSubsequence(i - 1,                                                  j - 1, s);     }      // Else make two recursive calls.     return Math.max(         findLongestRepeatingSubsequence(i - 1, j, s),         findLongestRepeatingSubsequence(i, j - 1, s)); }  function longestRepeatingSubsequence(s) {     const n = s.length;     return findLongestRepeatingSubsequence(n, n, s); }  const s = "AABEBCDD"; const res = longestRepeatingSubsequence(s); console.log(res); 

Output
3

Using Top-Down DP (Memoization) – O(n^2) Time and O(n^2) Space

If we notice carefully, we can observe that the above recursive solution holds the following two properties of Dynamic Programming:

1. Optimal Substructure: The maximum length of repeating subsequence originating from i, j, i.e., longestRepeatingSubsequence(i, j), depends on the optimal solution of longestRepeatingSubsequence(i-1, j-1) if characters match and indices don't match. Otherwise, it depends on the maximum of longestRepeatingSubsequence(i-1, j) and longestRepeatingSubsequence(i, j-1).

2. Overlapping Subproblems: While applying a recursive approach in this problem, we notice that certain subproblems are computed multiple times.

  • There are two parameters, i and j that changes in the recursive solution. So we create a 2D array of size n*n for memoization.
  • We initialize this array as -1 to indicate nothing is computed initially.
  • Now we modify our recursive solution to first check if the value is -1, then only make recursive calls. This way, we avoid re-computations of the same subproblems.
C++
// C++ program to find longest // repeating subsequence using memoization  #include <bits/stdc++.h> using namespace std;  int findLongestRepeatingSubsequence(int i, int j, string &s, vector<vector<int>> &memo) {      // base case     if (i == 0 || j == 0)         return 0;      // If value is computed, return it.     if (memo[i - 1][j - 1] != -1)         return memo[i - 1][j - 1];      // If characters match and their     // indices are different     if (s[i - 1] == s[j - 1] && i != j)     {          return memo[i - 1][j - 1] = 1 + findLongestRepeatingSubsequence(i - 1, j - 1, s, memo);     }      // Else make two recursive calls.     return memo[i - 1][j - 1] = max(findLongestRepeatingSubsequence(i - 1, j, s, memo),                                     findLongestRepeatingSubsequence(i, j - 1, s, memo)); }  int longestRepeatingSubsequence(string s) {      int n = s.length();     vector<vector<int>> memo(n, vector<int>(n, -1));     return findLongestRepeatingSubsequence(n, n, s, memo); }  int main() {      string s = "AABEBCDD";     int res = longestRepeatingSubsequence(s);     cout << res;      return 0; } 
Java
// Java program to find longest // repeating subsequence using memoization  class GfG {      static int findLongestRepeatingSubsequence(int i, int j,                                                String s,                                                int[][] memo) {          // base case         if (i == 0 || j == 0)             return 0;          // If value is computed, return it.         if (memo[i - 1][j - 1] != -1)             return memo[i - 1][j - 1];          // If characters match and their         // indices are different         if (s.charAt(i - 1) == s.charAt(j - 1) && i != j) {             return memo[i - 1][j - 1]                 = 1                   + findLongestRepeatingSubsequence(                       i - 1, j - 1, s, memo);         }          // Else make two recursive calls.         return memo[i - 1][j - 1]             = Math.max(findLongestRepeatingSubsequence(                            i - 1, j, s, memo),                        findLongestRepeatingSubsequence(                            i, j - 1, s, memo));     }      static int longestRepeatingSubsequence(String s) {         int n = s.length();         int[][] memo = new int[n][n];         for (int[] row : memo) {             java.util.Arrays.fill(row, -1);         }         return findLongestRepeatingSubsequence(n, n, s,                                                memo);     }      public static void main(String[] args) {         String s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         System.out.println(res);     } } 
Python
# Python program to find longest # repeating subsequence using memoization   def findLongestRepeatingSubsequence(i, j, s, memo):      # base case     if i == 0 or j == 0:         return 0      # If value is computed, return it.     if memo[i - 1][j - 1] != -1:         return memo[i - 1][j - 1]      # If characters match and their     # indices are different     if s[i - 1] == s[j - 1] and i != j:         memo[i - 1][j - 1] = 1 + \             findLongestRepeatingSubsequence(i - 1, j - 1, s, memo)         return memo[i - 1][j - 1]      # Else make two recursive calls.     memo[i - 1][j - 1] = max(findLongestRepeatingSubsequence(i - 1, j, s, memo),                              findLongestRepeatingSubsequence(i, j - 1, s, memo))     return memo[i - 1][j - 1]   def longestRepeatingSubsequence(s):     n = len(s)     memo = [[-1 for _ in range(n)] for _ in range(n)]     return findLongestRepeatingSubsequence(n, n, s, memo)   if __name__ == "__main__":     s = "AABEBCDD"     res = longestRepeatingSubsequence(s)     print(res) 
C#
// C# program to find longest // repeating subsequence using memoization  using System;  class GfG {      static int findLongestRepeatingSubsequence(int i, int j,                                                string s,                                                int[, ] memo) {          // base case         if (i == 0 || j == 0)             return 0;          // If value is computed, return it.         if (memo[i - 1, j - 1] != -1)             return memo[i - 1, j - 1];          // If characters match and their         // indices are different         if (s[i - 1] == s[j - 1] && i != j) {             memo[i - 1, j - 1]                 = 1                   + findLongestRepeatingSubsequence(                       i - 1, j - 1, s, memo);             return memo[i - 1, j - 1];         }          // Else make two recursive calls.         memo[i - 1, j - 1]             = Math.Max(findLongestRepeatingSubsequence(                            i - 1, j, s, memo),                        findLongestRepeatingSubsequence(                            i, j - 1, s, memo));         return memo[i - 1, j - 1];     }      static int longestRepeatingSubsequence(string s) {          int n = s.Length;         int[, ] memo = new int[n, n];         for (int i = 0; i < n; i++) {             for (int j = 0; j < n; j++) {                 memo[i, j] = -1;             }         }         return findLongestRepeatingSubsequence(n, n, s,                                                memo);     }      static void Main(string[] args) {          string s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         Console.WriteLine(res);     } } 
JavaScript
// JavaScript program to find longest // repeating subsequence using memoization  function findLongestRepeatingSubsequence(i, j, s, memo) {      // base case     if (i === 0 || j === 0)         return 0;      // If value is computed, return it.     if (memo[i - 1][j - 1] !== -1)         return memo[i - 1][j - 1];      // If characters match and their     // indices are different     if (s[i - 1] === s[j - 1] && i !== j) {         return memo[i - 1][j - 1]                = 1                  + findLongestRepeatingSubsequence(                      i - 1, j - 1, s, memo);     }      // Else make two recursive calls.     return memo[i - 1][j - 1]            = Math.max(findLongestRepeatingSubsequence(                           i - 1, j, s, memo),                       findLongestRepeatingSubsequence(                           i, j - 1, s, memo)); }  function longestRepeatingSubsequence(str) {      const n = s.length;     const memo         = Array.from({length : n}, () => Array(n).fill(-1));     return findLongestRepeatingSubsequence(n, n, s, memo); }  const s = "AABEBCDD"; const res = longestRepeatingSubsequence(s); console.log(res); 

Output
3

Using Bottom-Up DP (Tabulation) - O(n^2) Time and O(n^2) Space

The approach is similar to the previous one. just instead of breaking down the problem recursively, we iteratively build up the solution by calculating in bottom-up manner. The idea is to create a 2-D array. Then fill the values using dp[i][j] = 1 + dp[i-1][j-1] if characters match and indices don't match. Otherwise, set dp[i][j] = max(dp[i-1][j], dp[i], [j-1]).

C++
// C++ program to find longest // repeating subsequence using tabulation  #include <iostream> #include <vector> using namespace std;  int longestRepeatingSubsequence(string& s) {     int n = s.length();     vector<vector<int>> dp(n+1, vector<int>(n+1, 0));          for (int i=1; i<=n; i++) {         for (int j=1; j<=n; j++) {                          // If char match and indices             // are different             if (s[i-1]==s[j-1] && i!=j) {                 dp[i][j] = 1 + dp[i-1][j-1];             }             else {                 dp[i][j] = max(dp[i-1][j], dp[i][j-1]);             }         }     }          return dp[n][n]; }  int main() {     string s = "AABEBCDD";     int res = longestRepeatingSubsequence(s);     cout <<  res;      return 0; } 
Java
// Java program to find longest // repeating subsequence using tabulation  class GfG {      static int longestRepeatingSubsequence(String s) {         int n = s.length();         int[][] dp = new int[n + 1][n + 1];          for (int i = 1; i <= n; i++) {             for (int j = 1; j <= n; j++) {                  // If char match and indices                 // are different                 if (s.charAt(i - 1) == s.charAt(j - 1) && i != j) {                     dp[i][j] = 1 + dp[i - 1][j - 1];                 } else {                     dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);                 }             }         }          return dp[n][n];     }      public static void main(String[] args) {         String s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         System.out.println(res);     } } 
Python
# Python program to find longest # repeating subsequence using tabulation  def longestRepeatingSubsequence(s):     n = len(s)     dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]      for i in range(1, n + 1):         for j in range(1, n + 1):              # If char match and indices             # are different             if s[i - 1] == s[j - 1] and i != j:                 dp[i][j] = 1 + dp[i - 1][j - 1]             else:                 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])      return dp[n][n]  if __name__ == "__main__":     s = "AABEBCDD"     res = longestRepeatingSubsequence(s)     print(res) 
C#
// C# program to find longest // repeating subsequence using tabulation  using System;  class GfG {      static int longestRepeatingSubsequence(string s) {         int n = s.Length;         int[,] dp = new int[n + 1, n + 1];          for (int i = 1; i <= n; i++) {             for (int j = 1; j <= n; j++) {                  // If char match and indices                 // are different                 if (s[i - 1] == s[j - 1] && i != j) {                     dp[i, j] = 1 + dp[i - 1, j - 1];                 } else {                     dp[i, j] = Math.Max(dp[i - 1, j], dp[i, j - 1]);                 }             }         }          return dp[n, n];     }      static void Main(string[] args) {         string s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         Console.WriteLine(res);     } } 
JavaScript
// JavaScript program to find longest // repeating subsequence using tabulation  function longestRepeatingSubsequence(s) {     const n = s.length;     const dp = Array.from({ length: n + 1 }, () => Array(n + 1).fill(0));      for (let i = 1; i <= n; i++) {         for (let j = 1; j <= n; j++) {              // If char match and indices             // are different             if (s[i - 1] === s[j - 1] && i !== j) {                 dp[i][j] = 1 + dp[i - 1][j - 1];             } else {                 dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);             }         }     }      return dp[n][n]; }  const s = "AABEBCDD"; const res = longestRepeatingSubsequence(s); console.log(res); 

Output
3

Using Space Optimized DP - O(n^2) Time and O(n) Space

The idea is store the values for the previous row only. We can observe that for a given (i, j) its value is only dependent on (i-1, j-1) or (i-1, j) and (i, j-1).

C++
// C++ program to find longest // repeating subsequence // using space optimization  #include <bits/stdc++.h> using namespace std;  int longestRepeatingSubsequence(string& s) {        int n = s.length();      // Create a 1D array for the current row     vector<int> curr(n + 1, 0);      // Variable to store dp[i-1][j-1] for each (i, j)     // This helps to track the diagonal value from the previous iteration     int match = 0;      for (int i = 1; i <= n; i++) {          // Reset match to 0 for the new row         match = 0;          for (int j = 1; j <= n; j++) {              // Store the current cell value before updating             int tmp = curr[j];              // If characters match and indices are different             if (s[i - 1] == s[j - 1] && i != j) {                 // Add 1 to the diagonal value                 curr[j] = 1 + match;             }             else {                 // Take the maximum value between left and top cells                 curr[j] = max(curr[j], curr[j - 1]);             }             // Update match to the previous cell value             match = tmp;         }     }      return curr[n]; }  int main() {      string s = "AABEBCDD";     int res = longestRepeatingSubsequence(s);     cout << res;     return 0; } 
Java
// Java program to find the longest // repeating subsequence using space optimization  class GfG {      static int longestRepeatingSubsequence(String s) {                // Get the length of the input string         int n = s.length();          // Create a 1D array to store the current row's         // values         int[] curr = new int[n + 1];          // Variable to store the value of dp[i-1][j-1]         // (diagonal element)         int match;          // Iterate over all characters of the string for row         // index         for (int i = 1; i <= n; i++) {              // Reset match for each new row             match = 0;              // Iterate over all characters of the string for             // column index             for (int j = 1; j <= n; j++) {                  // Temporarily store the current cell value                 // before updating it                 int tmp = curr[j];                  // If characters match and indices are                 // different, update with diagonal value + 1                 if (s.charAt(i - 1) == s.charAt(j - 1)                     && i != j) {                     curr[j] = 1 + match;                 }                 else {                     // Otherwise, take the maximum of the                     // left and top cells                     curr[j]                         = Math.max(curr[j], curr[j - 1]);                 }                  // Update match to the previously stored                 // value of curr[j]                 match = tmp;             }         }          // Return the value in the last cell, which contains         // the length of the longest repeating subsequence         return curr[n];     }      public static void main(String[] args) {                  String s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         System.out.println(res);     } } 
Python
# Python program to find the longest # repeating subsequence using space optimization   def longestRepeatingSubsequence(s):      # Get the length of the input string     n = len(s)      # Create a 1D array to store the current row's values     curr = [0] * (n + 1)      # Variable to store the value of dp[i-1][j-1] (diagonal element)     match = 0      # Iterate over all characters of the string for row index     for i in range(1, n + 1):          # Reset match for each new row         match = 0          # Iterate over all characters of the string for column index         for j in range(1, n + 1):              # Temporarily store the current cell value before updating it             tmp = curr[j]              # If characters match and indices are different,             # update with diagonal value + 1             if s[i - 1] == s[j - 1] and i != j:                 curr[j] = 1 + match             else:                 # Otherwise, take the maximum of the left and top cells                 curr[j] = max(curr[j], curr[j - 1])              # Update match to the previously stored value of curr[j]             match = tmp      # Return the value in the last cell, which contains the length of     # the longest repeating subsequence     return curr[n]   if __name__ == "__main__":     s = "AABEBCDD"     res = longestRepeatingSubsequence(s)     print(res) 
C#
// C# program to find the longest // repeating subsequence using space optimization  using System;  class GfG {     static int longestRepeatingSubsequence(string s) {                // Get the length of the input string         int n = s.Length;          // Create a 1D array to store the current row's         // values         int[] curr = new int[n + 1];          // Variable to store the value of dp[i-1][j-1]         // (diagonal element)         int match = 0;          // Iterate over all characters of the string for row         // index         for (int i = 1; i <= n; i++) {             // Reset match for each new row             match = 0;              // Iterate over all characters of the string for             // column index             for (int j = 1; j <= n; j++) {                 // Temporarily store the current cell value                 // before updating it                 int tmp = curr[j];                  // If characters match and indices are                 // different, update with diagonal value + 1                 if (s[i - 1] == s[j - 1] && i != j) {                     curr[j] = 1 + match;                 }                 else {                     // Otherwise, take the maximum of the                     // left and top cells                     curr[j]                         = Math.Max(curr[j], curr[j - 1]);                 }                  // Update match to the previously stored                 // value of curr[j]                 match = tmp;             }         }          // Return the value in the last cell, which contains         // the length of the longest repeating subsequence         return curr[n];     }      static void Main(string[] args) {         string s = "AABEBCDD";         int res = longestRepeatingSubsequence(s);         Console.WriteLine(res);     } } 
JavaScript
// JavaScript program to find the longest // repeating subsequence using space optimization  function longestRepeatingSubsequence(s) {      // Get the length of the input string     const n = s.length;      // Create an array to store the current row's values     const curr = new Array(n + 1).fill(0);      // Variable to store the value of dp[i-1][j-1] (diagonal     // element)     let match = 0;      // Iterate over all characters of the string for row     // index     for (let i = 1; i <= n; i++) {          // Reset match for each new row         match = 0;          // Iterate over all characters of the string for         // column index         for (let j = 1; j <= n; j++) {              // Temporarily store the current cell value             // before updating it             const tmp = curr[j];              // If characters match and indices are             // different, update with diagonal value + 1             if (s[i - 1] === s[j - 1] && i !== j) {                 curr[j] = 1 + match;             }             else {                 // Otherwise, take the maximum of the left                 // and top cells                 curr[j] = Math.max(curr[j], curr[j - 1]);             }              // Update match to the previously stored value             // of curr[j]             match = tmp;         }     }      // Return the value in the last cell, which contains the     // length of the longest repeating subsequence     return curr[n]; }    const s = "AABEBCDD"; const res = longestRepeatingSubsequence(s); console.log(res); 

Output
3

Next Article
Longest Common Anagram Subsequence

K

kartik
Improve
Article Tags :
  • Dynamic Programming
  • DSA
  • Amazon
  • subsequence
Practice Tags :
  • Amazon
  • Dynamic Programming

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 long
    15+ min read
    LCS (Longest Common Subsequence) of three strings
    Given three strings s1, s2 and s3. Your task is to find the longest common sub-sequence in all three given sequences.Note: This problem is simply an extension of LCS.Examples: Input: s1 = "geeks" , s2 = "geeksfor", s3 = "geeksforgeeks"Output : 5Explanation: Longest common subsequence is "geeks" i.e.
    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:Pay
    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 su
    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= "ab
    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 : 1Perquisit
    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 = “GXTXAYB”O
    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[] = [12,
    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], wher
    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