Given two strings X and Y, find the length of the longest common substring. A substring is a contiguous sequence of characters within a string, and the longest common substring is the longest contiguous segment that appears in both strings.
Input/Output Examples
plaintext
Example 1:
Input: X = "abcde", Y = "abfce"
Output: 2
Explanation: The longest common substring is "ab", which has a length of 2.
Example 2:
Input: X = "abcdef", Y = "zabcf"
Output: 3
Explanation: The longest common substring is "abc", which has a length of 3.
Approach to find the Longest Common Substring
- Dynamic Programming Approach:
- Create a 2D DP table, dp[i][j], whereiandjare indices of the stringsXandY.
- dp[i][j]represents the length of the longest common substring ending at- X[i-1]and- Y[j-1].
- If X[i-1] == Y[j-1], thendp[i][j] = dp[i-1][j-1] + 1(we extend the previous common substring).
- If the characters don't match, dp[i][j] = 0(reset the substring).
 
- Create a 2D DP table, 
- Algorithm:
- Initialize a 2D DP table of size (len(X)+1) x (len(Y)+1)filled with zeros.
- Traverse both strings, and for each pair of characters, update the DP table according to the rules above.
- Keep track of the maximum value in the DP table, which represents the length of the longest common substring.
 
- Initialize a 2D DP table of size 
- Edge Cases:
- If either string is empty, the longest common substring is of length 0.
- If there are no common substrings, return 0.
 
- If either string is empty, the longest common substring is of length 
C++ Program to find the Longest Common Substring
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Function to find the length of the longest common substring
int longestCommonSubstring(string X, string Y) {
    int m = X.length();
    int n = Y.length();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    int maxLength = 0;
    // Build the DP table
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (X[i - 1] == Y[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                maxLength = max(maxLength, dp[i][j]);
            }
        }
    }
    return maxLength;
}
int main() {
    string X = "abcde";
    string Y = "abfce";
    
    int result = longestCommonSubstring(X, Y);
    cout << "Length of the longest common substring: " << result << endl;
    
    return 0;
}
Java Program to find the Longest Common Substring
java
public class LongestCommonSubstring {
    // Function to find the length of the longest common substring
    public static int longestCommonSubstring(String X, String Y) {
        int m = X.length();
        int n = Y.length();
        int[][] dp = new int[m + 1][n + 1];
        int maxLength = 0;
        // Build the DP table
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (X.charAt(i - 1) == Y.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    maxLength = Math.max(maxLength, dp[i][j]);
                }
            }
        }
        return maxLength;
    }
    public static void main(String[] args) {
        String X = "abcde";
        String Y = "abfce";
        
        int result = longestCommonSubstring(X, Y);
        System.out.println("Length of the longest common substring: " + result);
    }
}
Python Program to find the Longest Common Substring
python
# Function to find the length of the longest common substring
def longest_common_substring(X, Y):
    m, n = len(X), len(Y)
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    max_length = 0
    # Build the DP table
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if X[i - 1] == Y[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
                max_length = max(max_length, dp[i][j])
    return max_length
# Example usage
if __name__ == "__main__":
    X = "abcde"
    Y = "abfce"
    result = longest_common_substring(X, Y)
    print("Length of the longest common substring:", result)
Time Complexity:
- O(m * n): We iterate through both strings once, where mis the length of stringXandnis the length of stringY.
Space Complexity:
- O(m * n): We use a 2D DP table of size (m + 1) x (n + 1).