Recursion
Learning

Recursion

1256 × 1034px April 22, 2025 Ashley
Download

The Longest Common Subsequence (LCS) is a fundamental concept in computer science and bioinformatics, used to determine the longest subsequence present in two or more sequences. This problem is widely studied due to its applications in various fields, including text comparison, DNA sequence alignment, and data compression. Understanding the LCS problem and its solutions can provide valuable insights into algorithm design and optimization.

Understanding the Longest Common Subsequence Problem

The Longest Common Subsequence problem involves finding the longest sequence that appears in the same order (but not necessarily contiguously) in two or more sequences. For example, given two strings "AGGTAB" and "GXTXAYB," the LCS is "GTAB," which appears in both strings in the same order.

To solve the LCS problem, we need to consider the following key points:

  • The subsequence must appear in the same order in both sequences.
  • The subsequence does not need to be contiguous.
  • The goal is to find the longest such subsequence.

Dynamic Programming Approach to LCS

The most common and efficient way to solve the LCS problem is by using dynamic programming. This approach involves building a table that stores the lengths of the longest common subsequences for different substrings of the input sequences. Here’s a step-by-step guide to implementing the dynamic programming solution:

Step 1: Define the Problem

Let's denote the two input sequences as X and Y with lengths m and n, respectively. We need to find the length of the LCS of X and Y.

Step 2: Create a 2D Array

Create a 2D array L[m+1][n+1] where L[i][j] contains the length of the LCS of X[0..i-1] and Y[0..j-1].

Step 3: Initialize the Array

Initialize the first row and the first column of the array to 0 because the LCS of any sequence with an empty sequence is 0.

Step 4: Fill the Array

Fill the array using the following rules:

  • If X[i-1] == Y[j-1], then L[i][j] = L[i-1][j-1] + 1
  • If X[i-1] != Y[j-1], then L[i][j] = max(L[i-1][j], L[i][j-1])

Step 5: Extract the LCS

To extract the actual LCS, trace back from L[m][n] to L[0][0] using the following rules:

  • If X[i-1] == Y[j-1], then X[i-1] is part of the LCS. Move diagonally up to L[i-1][j-1].
  • If X[i-1] != Y[j-1], move in the direction of the maximum value between L[i-1][j] and L[i][j-1].

💡 Note: The time complexity of this approach is O(m*n), where m and n are the lengths of the input sequences. The space complexity is also O(m*n) due to the storage required for the 2D array.

Example Implementation in Python

Here is a Python implementation of the dynamic programming approach to find the LCS of two sequences:


def lcs(X, Y):
    m = len(X)
    n = len(Y)

    # Create a 2D array to store lengths of longest common subsequence.
    L = [[0] * (n + 1) for _ in range(m + 1)]

    # Build the L[m+1][n+1] array in bottom-up fashion
    for i in range(m + 1):
        for j in range(n + 1):
            if i == 0 or j == 0:
                L[i][j] = 0
            elif X[i - 1] == Y[j - 1]:
                L[i][j] = L[i - 1][j - 1] + 1
            else:
                L[i][j] = max(L[i - 1][j], L[i][j - 1])

    # Following code is used to print LCS
    index = L[m][n]

    # Create a character array to store the lcs string
    lcs = [""] * (index)

    # Start from the right-most-bottom-most corner and
    # one by one store characters in lcs[]
    i = m
    j = n
    while i > 0 and j > 0:

        # If current character in X[] and Y[] are same, then
        # current character is part of LCS
        if X[i - 1] == Y[j - 1]:
            lcs[index - 1] = X[i - 1]
            i -= 1
            j -= 1
            index -= 1

        # If not same, then find the larger of two and
        # go in the direction of larger value
        elif L[i - 1][j] > L[i][j - 1]:
            i -= 1
        else:
            j -= 1

    return "".join(lcs)

# Example usage
X = "AGGTAB"
Y = "GXTXAYB"
print("LCS of", X, "and", Y, "is", lcs(X, Y))

Applications of Longest Common Subsequence

The Longest Common Subsequence problem has numerous applications across various fields. Some of the key applications include:

Bioinformatics

In bioinformatics, the LCS problem is used to compare DNA sequences. By finding the LCS of two DNA sequences, researchers can identify regions of similarity, which can provide insights into genetic relationships and evolutionary history.

Text Comparison

The LCS problem is also used in text comparison tools to identify similarities between two texts. This is useful in plagiarism detection, version control systems, and text editing software.

Data Compression

In data compression, the LCS problem can be used to identify redundant information in data streams. By finding the LCS of two data streams, compression algorithms can reduce the amount of data that needs to be stored or transmitted.

Pattern Matching

The LCS problem is used in pattern matching algorithms to find common patterns in sequences. This is useful in fields such as natural language processing, image recognition, and speech recognition.

Optimizing the LCS Algorithm

While the dynamic programming approach is efficient for many applications, there are ways to optimize the LCS algorithm further. One common optimization is to reduce the space complexity by using a single-dimensional array instead of a two-dimensional array.

Here’s how you can optimize the space complexity:

Step 1: Use a Single-Dimensional Array

Instead of using a 2D array, use a 1D array to store the lengths of the LCS for the current and previous rows.

Step 2: Update the Array

Update the array in a way that only the current and previous rows are needed at any given time. This reduces the space complexity to O(min(m, n)).

💡 Note: This optimization is particularly useful when the lengths of the input sequences are significantly different.

Conclusion

The Longest Common Subsequence problem is a classic example of dynamic programming and has wide-ranging applications in various fields. By understanding the dynamic programming approach and its optimizations, one can efficiently solve the LCS problem for different types of sequences. The LCS problem not only helps in comparing sequences but also provides valuable insights into pattern recognition, data compression, and bioinformatics. Whether you are a computer scientist, bioinformatician, or data analyst, mastering the LCS problem can significantly enhance your problem-solving skills and open up new avenues for research and development.

Related Terms:

  • shortest common subsequence
  • longest palindromic subsequence
  • longest common subsequence problem
  • longest increasing subsequence
  • longest common subsequence java
  • longest consecutive subsequence
More Images
Longest Common Subsequence & Matrix Chain Multiplication | PPTX
Longest Common Subsequence & Matrix Chain Multiplication | PPTX
2048×1152
Longest Common Subsequence problem: solved | Board Infinity
Longest Common Subsequence problem: solved | Board Infinity
1920×1080
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152
Longest Common Subsequence problem: solved | Board Infinity
Longest Common Subsequence problem: solved | Board Infinity
1920×1080
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
1125×1937
Longest Common Subsequence | PPT
Longest Common Subsequence | PPT
2048×1536
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
1125×1937
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
1125×1262
[LeetCode] 1143. Longest Common Subsequence
[LeetCode] 1143. Longest Common Subsequence
1246×1594
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
1125×1885
Longest common subsequence | PPTX
Longest common subsequence | PPTX
2048×1152
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
1125×1262
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152
Longest Common Subsequence | PPTX
Longest Common Subsequence | PPTX
2048×1152
Longest common subsequence(dynamic programming). | PPT
Longest common subsequence(dynamic programming). | PPT
2048×1536
[2024] Day25. 1143. Longest Common Subsequence
[2024] Day25. 1143. Longest Common Subsequence
1246×1206
Longest Common Subsequence | PPT
Longest Common Subsequence | PPT
2048×1536
Recursion
Recursion
1256×1034
Longest Common Subsequence | PPT
Longest Common Subsequence | PPT
2048×1536
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common ...
1125×1940
Solved Complete the following table-LCS constructed by the | Chegg.com
Solved Complete the following table-LCS constructed by the | Chegg.com
1920×1071
The longest common subsequence (LCS) problem - A subsequence is a ...
The longest common subsequence (LCS) problem - A subsequence is a ...
1200×1553
Longest common subsequence lcs | PPTX
Longest common subsequence lcs | PPTX
2048×1152
HackerRank The Longest Common Subsequence - TheCScience
HackerRank The Longest Common Subsequence - TheCScience
2048×1152
Longest Common Subsequence 最长公共子序列LCS算法介绍 经典动态规划 DP_哔哩哔哩_bilibili
Longest Common Subsequence 最长公共子序列LCS算法介绍 经典动态规划 DP_哔哩哔哩_bilibili
1728×1080
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152
Longest Common Subsequence | PPT
Longest Common Subsequence | PPT
2048×1536
Longest Common Subsequence (LCS) Algorithm | PPTX
Longest Common Subsequence (LCS) Algorithm | PPTX
2048×1152
Find Longest Common Subsequence Of Two Strings - Design Talk
Find Longest Common Subsequence Of Two Strings - Design Talk
1920×1080
Longest Common Subsequence | PPT
Longest Common Subsequence | PPT
2048×1536
Longest common subsequence(dynamic programming). | PPT
Longest common subsequence(dynamic programming). | PPT
2048×1536
Longest Common subsequence.pptx
Longest Common subsequence.pptx
2048×1152
Longest Common subsequence.pptx
Longest Common subsequence.pptx
2048×1152
Longest Common Sub-sequence (LCS) | PPTX
Longest Common Sub-sequence (LCS) | PPTX
2048×1152