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 both arrays are {8, 2, 1} and the length of the subarray is 3.Input: A[] = {1, 2, 3, 2, 1}, B[] = {8, 7, 6, 4, 7}Â
Output: 0Â
Explanation:Â
There is no such subarrays which are equal in the array A[] and B[].Â
Naive Approach: The idea is to generate all the subarrays of the two given array A[] and B[] and find the longest matching subarray. This solution is exponential in terms of time complexity.
C++
#include <iostream>#include <vector>using namespace std;Â
// Recursive function to find the longest common subarray (LCS)int LCS(int i, int j, const vector<int>& A, const vector<int>& B, int count) {    // Base case: If either of the indices reaches the end of the array, return the count    if (i == A.size() || j == B.size())        return count;         // If the current elements are equal, recursively check the next elements    if (A[i] == B[j])        count = LCS(i + 1, j + 1, A, B, count + 1);         // Recursively check for the longest common subarray by considering two possibilities:    // 1. Exclude current element from array A and continue with array B    // 2. Exclude current element from array B and continue with array A    count = max(count, max(LCS(i + 1, j, A, B, 0), LCS(i, j + 1, A, B, 0)));         return count;}Â
int main() {    // Example arrays    vector<int> A = {1, 2, 3, 2, 1};    vector<int> B = {3, 2, 1, 4, 7};         // Call the LCS function to find the maximum length of the common subarray    int maxLength = LCS(0, 0, A, B, 0);         // Print the result    cout << "Max length of common subarray: " << maxLength << endl;         return 0;} |
Java
import java.util.Arrays;import java.util.Vector;Â
public class Main {    // Recursive function to find the longest common subarray (LCS)    static int LCS(int i, int j, Vector<Integer> A,                    Vector<Integer> B, int count) {        // Base case: If either of the indices reaches the end of the array, return the count        if (i == A.size() || j == B.size())            return count;Â
        // If the current elements are equal, recursively check the next elements        if (A.get(i).equals(B.get(j)))            count = LCS(i + 1, j + 1, A, B, count + 1);Â
        // Recursively check for the longest common subarray by considering two possibilities:        // 1. Exclude the current element from array A and continue with array B        // 2. Exclude the current element from array B and continue with array A        count = Math.max(count, Math.max(LCS(i + 1, j, A, B, 0),                                          LCS(i, j + 1, A, B, 0)));Â
        return count;    }Â
    public static void main(String[] args) {        // Example arrays        Vector<Integer> A = new Vector<>(Arrays.asList(1, 2, 3, 2, 1));        Vector<Integer> B = new Vector<>(Arrays.asList(3, 2, 1, 4, 7));Â
        // Call the LCS function to find the maximum length of the common subarray        int maxLength = LCS(0, 0, A, B, 0);Â
        // Print the result        System.out.println("Max length of common subarray: " + maxLength);    }}// This code is contributed by akshitaguprjz3 |
Python3
def LCS(i, j, A, B, count):    # Base case: If either of the indices reaches the end of the array,     # return the count    if i == len(A) or j == len(B):        return count         # If the current elements are equal, recursively check the     # next elements    if A[i] == B[j]:        count = LCS(i + 1, j + 1, A, B, count + 1)         # Recursively check for the longest common subarray by considering two possibilities:    # 1. Exclude current element from array A and continue with array B    # 2. Exclude current element from array B and continue with array A    return max(count, max(LCS(i + 1, j, A, B, 0), LCS(i, j + 1, A, B, 0)))Â
# Example arraysA = [1, 2, 3, 2, 1]B = [3, 2, 1, 4, 7]Â
# Call the LCS function to find the maximum length of the common subarraymaxLength = LCS(0, 0, A, B, 0)Â
# Print the resultprint("Max length of common subarray:", maxLength) |
C#
using System;Â
class GFG {    // Recursive function to find the longest common    // subarray (LCS)    static int LCS(int i, int j, int[] A, int[] B,                   int count)    {        // Base case: If either of the indices reaches the        // end of the array, return the count        if (i == A.Length || j == B.Length)            return count;Â
        // If the current elements are equal, recursively        // check the next elements        if (A[i] == B[j])            count = LCS(i + 1, j + 1, A, B, count + 1);Â
        // Recursively check for the longest common subarray        // by considering two possibilities:        // 1. Exclude the current element from array A and        // continue with array B        // 2. Exclude the current element from array B and        // continue with array A        count = Math.Max(count,                         Math.Max(LCS(i + 1, j, A, B, 0),                                  LCS(i, j + 1, A, B, 0)));Â
        return count;    }Â
    static void Main()    {        // Example arrays        int[] A = { 1, 2, 3, 2, 1 };        int[] B = { 3, 2, 1, 4, 7 };Â
        // Call the LCS function to find the maximum length        // of the common subarray        int maxLength = LCS(0, 0, A, B, 0);Â
        // Print the result        Console.WriteLine("Max length of common subarray: "                          + maxLength);    }} |
Max length of common subarray: 3
Time Complexity: O(2N+M), where N is the length of the array A[] and M is the length of the array B[].
Efficient Approach:Â
The efficient approach is to use Dynamic Programming(DP). This problem is the variation of the Longest Common Subsequence(LCS).Â
Let the input sequences are A[0..n-1] and B[0..m-1] of lengths m & n respectively. Following is the recursive implementation of the equal subarrays:Â
- Since common subarray of A[] and B[] must start at some index i and j such that A[i] is equals to B[j]. Let dp[i][j] be the longest common subarray of A[i…] and B[j…].
- Therefore, for any index i and j, if A[i] is equals to B[j], then dp[i][j] = dp[i+1][j+1] + 1.
- The maximum of all the elements in the array dp[][] will give the maximum length of equal subarrays.
For Example:Â
If the given array A[] = {1, 2, 8, 2, 1} and B[] = {8, 2, 1, 4, 7}.
If the characters match at index i and j for the array A[] and B[] respectively, then dp[i][j] will be updated as 1 + dp[i+1][j+1].Â
Below is the updated dp[][] table for the given array A[] and B[].Â
Below is the implementation of the above approach:Â
C++
// C++ program to DP approach// to above solution#include <bits/stdc++.h>using namespace std;Â
// Function to find the maximum// length of equal subarrayint FindMaxLength(int A[], int B[], int n, int m){Â
    // Auxiliary dp[][] array    int dp[n + 1][m + 1];    for (int i = 0; i <= n; i++)        for (int j = 0; j <= m; j++)            dp[i][j] = 0;Â
    // Updating the dp[][] table    // in Bottom Up approach    for (int i = n - 1; i >= 0; i--) {        for (int j = m - 1; j >= 0; j--) {            // If A[i] is equal to B[i]            // then dp[j][i] = dp[j + 1][i + 1] + 1            if (A[i] == B[j])                dp[i][j] = dp[i + 1][j + 1] + 1;        }    }    int maxm = 0;Â
    // Find maximum of all the values    // in dp[][] array to get the    // maximum length    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            // Update the length            maxm = max(maxm, dp[i][j]);        }    }Â
    // Return the maximum length    return maxm;}Â
// Driver Codeint main(){Â Â Â Â int A[] = { 1, 2, 8, 2, 1 };Â Â Â Â int B[] = { 8, 2, 1, 4, 7 };Â
    int n = sizeof(A) / sizeof(A[0]);    int m = sizeof(B) / sizeof(B[0]);Â
    // Function call to find    // maximum length of subarray    cout << (FindMaxLength(A, B, n, m));}Â
// This code is contributed by chitranayal |
Java
// Java program to DP approach// to above solutionclass GFG {    // Function to find the maximum    // length of equal subarray    static int FindMaxLength(int A[], int B[], int n, int m)    {Â
        // Auxiliary dp[][] array        int[][] dp = new int[n + 1][m + 1];        for (int i = 0; i <= n; i++)            for (int j = 0; j <= m; j++)                dp[i][j] = 0;Â
        // Updating the dp[][] table        // in Bottom Up approach        for (int i = n - 1; i >= 0; i--)        {            for (int j = m - 1; j >= 0; j--)             {                // If A[i] is equal to B[i]                // then dp[j][i] = dp[j + 1][i + 1] + 1                if (A[i] == B[j])                    dp[i][j] = dp[i + 1][j + 1] + 1;            }        }        int maxm = 0;Â
        // Find maximum of all the values        // in dp[][] array to get the        // maximum length        for (int i = 0; i < n; i++)         {            for (int j = 0; j < m; j++)             {                // Update the length                maxm = Math.max(maxm, dp[i][j]);            }        }Â
        // Return the maximum length        return maxm;    }Â
    // Driver Code    public static void main(String[] args)    {        int A[] = { 1, 2, 8, 2, 1 };        int B[] = { 8, 2, 1, 4, 7 };Â
        int n = A.length;        int m = B.length;Â
        // Function call to find        // maximum length of subarray        System.out.print(FindMaxLength(A, B, n, m));    }}Â
// This code is contributed by PrinciRaj1992 |
Python3
# Python program to DP approach# to above solutionÂ
# Function to find the maximum# length of equal subarrayÂ
Â
def FindMaxLength(A, B):Â Â Â Â n = len(A)Â Â Â Â m = len(B)Â
    # Auxiliary dp[][] array    dp = [[0 for i in range(n + 1)] for i in range(m + 1)]Â
    # Updating the dp[][] table    # in Bottom Up approach    for i in range(n - 1, -1, -1):        for j in range(m - 1, -1, -1):Â
            # If A[i] is equal to B[i]            # then dp[j][i] = dp[j + 1][i + 1] + 1            if A[i] == B[j]:                dp[i][j] = dp[i + 1][j + 1] + 1    maxm = 0Â
    # Find maximum of all the values    # in dp[][] array to get the    # maximum length    for i in dp:        for j in i:Â
            # Update the length            maxm = max(maxm, j)Â
    # Return the maximum length    return maxmÂ
Â
# Driver Codeif __name__ == '__main__':Â Â Â Â A = [1, 2, 8, 2, 1]Â Â Â Â B = [8, 2, 1, 4, 7]Â
    # Function call to find    # maximum length of subarray    print(FindMaxLength(A, B)) |
C#
// C# program to DP approach// to above solutionusing System;Â
class GFG {    // Function to find the maximum    // length of equal subarray    static int FindMaxLength(int[] A, int[] B, int n, int m)    {Â
        // Auxiliary [,]dp array        int[, ] dp = new int[n + 1, m + 1];        for (int i = 0; i <= n; i++)            for (int j = 0; j <= m; j++)                dp[i, j] = 0;Â
        // Updating the [,]dp table        // in Bottom Up approach        for (int i = n - 1; i >= 0; i--)         {            for (int j = m - 1; j >= 0; j--)            {                // If A[i] is equal to B[i]                // then dp[j, i] = dp[j + 1, i + 1] + 1                if (A[i] == B[j])                    dp[i, j] = dp[i + 1, j + 1] + 1;            }        }        int maxm = 0;Â
        // Find maximum of all the values        // in [,]dp array to get the        // maximum length        for (int i = 0; i < n; i++) {            for (int j = 0; j < m; j++) {Â
                // Update the length                maxm = Math.Max(maxm, dp[i, j]);            }        }Â
        // Return the maximum length        return maxm;    }Â
    // Driver Code    public static void Main(String[] args)    {        int[] A = { 1, 2, 8, 2, 1 };        int[] B = { 8, 2, 1, 4, 7 };Â
        int n = A.Length;        int m = B.Length;Â
        // Function call to find        // maximum length of subarray        Console.Write(FindMaxLength(A, B, n, m));    }}Â
// This code is contributed by PrinciRaj1992 |
Javascript
<script>// Javascript program to DP approach// to above solution         // Function to find the maximum    // length of equal subarray    function FindMaxLength(A,B,n,m)    {        // Auxiliary dp[][] array        let dp = new Array(n + 1);        for (let i = 0; i <= n; i++)        {            dp[i]=new Array(m+1);            for (let j = 0; j <= m; j++)                dp[i][j] = 0;         }        // Updating the dp[][] table        // in Bottom Up approach        for (let i = n - 1; i >= 0; i--)        {            for (let j = m - 1; j >= 0; j--)            {                // If A[i] is equal to B[i]                // then dp[i][j] = dp[i + 1][j + 1] + 1                if (A[i] == B[j])                    dp[j][i] = dp[j + 1][i + 1] + 1;            }        }        let maxm = 0;          // Find maximum of all the values        // in dp[][] array to get the        // maximum length        for (let i = 0; i < n; i++)        {            for (let j = 0; j < m; j++)            {                // Update the length                maxm = Math.max(maxm, dp[i][j]);            }        }          // Return the maximum length        return maxm;    }         // Driver Code    let A=[1, 2, 8, 2, 1 ];    let B=[8, 2, 1, 4, 7];    let n = A.length;    let m = B.length;         // Function call to find        // maximum length of subarray    document.write(FindMaxLength(A, B, n, m));               // This code is contributed by avanitrachhadiya2155</script> |
3
Time Complexity: O(N*M), where N is the length of array A[] and M is the length of array B[].
Auxiliary Space: O(N*M)
Efficient approach: space optimization
In previous approach the dp[i][j] is depend upon the current and previous row of 2D matrix. So to optimize the space complexity we use only single vector dp for current row and a variable prev to get the previous computation.Â
Implementation Steps :
- Create a vector DP of size M+1 , that stores the computation of subproblems and initialize it with 0.
- Initialize a variable maxm with 0 used to store the maximum length.
- Now iterative over subproblems and update the DP vector in bottom up approach.
- Initialize variable prev and temp. prev is used to get the previous row value of Dp and temp is used to get the value of prev in another iteration.
- While iterating update the maxm with respect to the value stored in DP.
- At last return the maxm.
Implementation:
C++
#include <bits/stdc++.h>using namespace std;Â
// Function to find the maximum// length of equal subarrayint FindMaxLength(int A[], int B[], int n, int m){Â
    // Auxiliary dp[] vector    vector<int> dp(m + 1, 0);    int maxm = 0;Â
    // Updating the dp[] vector    // in Bottom Up approach    for (int i = n - 1; i >= 0; i--) {        int prev = 0;        for (int j = m - 1; j >= 0; j--) {            int temp = dp[j];            if (A[i] == B[j]) {                dp[j] = prev + 1;                maxm = max(maxm, dp[j]);            }            else {                dp[j] = 0;            }            prev = temp;        }    }Â
    // Return the maximum length    return maxm;}Â
// Driver Codeint main(){Â Â Â Â int A[] = { 1, 2, 8, 2, 1 };Â Â Â Â int B[] = { 8, 2, 1, 4, 7 };Â
    int n = sizeof(A) / sizeof(A[0]);    int m = sizeof(B) / sizeof(B[0]);Â
    // Function call to find    // maximum length of subarray    cout << (FindMaxLength(A, B, n, m));} |
Java
import java.util.Arrays;Â
public class Main {         // Function to find the maximum length of equal subarray    static int findMaxLength(int[] A, int[] B, int n, int m) {        // Auxiliary dp[] array        int[] dp = new int[m + 1];        int maxm = 0;Â
        // Updating the dp[] array in Bottom Up approach        for (int i = n - 1; i >= 0; i--) {            int prev = 0;            for (int j = m - 1; j >= 0; j--) {                int temp = dp[j];                if (A[i] == B[j]) {                    dp[j] = prev + 1;                    maxm = Math.max(maxm, dp[j]);                } else {                    dp[j] = 0;                }                prev = temp;            }        }Â
        // Return the maximum length        return maxm;    }Â
    public static void main(String[] args) {        int[] A = { 1, 2, 8, 2, 1 };        int[] B = { 8, 2, 1, 4, 7 };Â
        int n = A.length;        int m = B.length;Â
        // Function call to find maximum length of subarray        System.out.println(findMaxLength(A, B, n, m));    }} |
Python3
# codedef find_max_length(A, B, n, m):    # Auxiliary dp[] list    dp = [0] * (m + 1)    maxm = 0Â
    # Updating the dp[] list    # in Bottom Up approach    for i in range(n - 1, -1, -1):        prev = 0        for j in range(m - 1, -1, -1):            temp = dp[j]            if A[i] == B[j]:                dp[j] = prev + 1                maxm = max(maxm, dp[j])            else:                dp[j] = 0            prev = tempÂ
    # Return the maximum length    return maxmÂ
# Driver Codeif __name__ == '__main__':Â Â Â Â A = [1, 2, 8, 2, 1]Â Â Â Â B = [8, 2, 1, 4, 7]Â Â Â Â n = len(A)Â Â Â Â m = len(B)Â
    print(find_max_length(A, B, n, m)) |
Javascript
// Function to find the maximum length of equal subarrayfunction FindMaxLength(A, B, n, m) {    // Auxiliary dp[] vector    let dp = new Array(m + 1).fill(0);    let maxm = 0;Â
    // Updating the dp[] vector in Bottom Up approach    for (let i = n - 1; i >= 0; i--) {        let prev = 0;        for (let j = m - 1; j >= 0; j--) {            let temp = dp[j];            if (A[i] == B[j]) {                dp[j] = prev + 1;                maxm = Math.max(maxm, dp[j]);            } else {                dp[j] = 0;            }            prev = temp;        }    }Â
    // Return the maximum length    return maxm;}Â
let A = [1, 2, 8, 2, 1];let B = [8, 2, 1, 4, 7];Â
let n = A.length;let m = B.length;Â
// Function call to find maximum length of subarrayconsole.log(FindMaxLength(A, B, n, m)); |
3
Time Complexity: O(N*M)
Auxiliary Space: O(M) , only use one vector dp of size M
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!




