Longest Common Subsequence

 Given two strings text1 and text2, return the length of their longest common subsequence. If there is no common subsequence, return 0.


A subsequence of a string is a new string generated from the original string with some characters (can be none) deleted without changing the relative order of the remaining characters.


For example, "ace" is a subsequence of "abcde".

A common subsequence of two strings is a subsequence that is common to both strings.


 


Example 1:


Input: text1 = "abcde", text2 = "ace" 

Output: 3  

Explanation: The longest common subsequence is "ace" and its length is 3.

Example 2:


Input: text1 = "abc", text2 = "abc"

Output: 3

Explanation: The longest common subsequence is "abc" and its length is 3.

Example 3:


Input: text1 = "abc", text2 = "def"

Output: 0

Explanation: There is no such common subsequence, so the result is 0.

 


Constraints:


1 <= text1.length, text2.length <= 1000

text1 and text2 consist of only lowercase English characters.



🧠 Understanding Subsequence

A subsequence:

  • Appears in the same order

  • Characters can be skipped

  • Must not be rearranged

E.g., For "abcde", subsequences can be: "a", "ace", "bce", etc.

🧩 Approach 1: Recursion + Memoization (Top-Down DP)

📌 Function:

Let dp[i][j] represent LCS length of text1[i:] and text2[j:]

🔁 Recurrence Relation:

  • If characters match:

  • dp[i][j] = 1 + dp[i+1][j+1]

If not:
dp[i][j] = max(dp[i+1][j], dp[i][j+1])

🛑 Base Case:

  • If i == len(text1) or j == len(text2) → return 0

class Solution {

    public int helper(int i,int j,String text1, String text2,int [][] dp)
    {

        if(i==text1.length() || j==text2.length())
        {
            return 0;
        }

        if(dp[i][j] !=-1)
        {
            return dp[i][j];
        }

        if(text1.charAt(i) == text2.charAt(j))
        {
            dp[i][j]=1+helper(i+1, j+1, text1, text2, dp);
        }
        else
        {
            int skipText1=helper(i+1, j, text1, text2, dp);
            int skipText2=helper(i, j+1, text1, text2, dp);

            dp[i][j]=Math.max(skipText1,skipText2);
        }

        return dp[i][j];
    }
    public int longestCommonSubsequence(String text1, String text2) {
       
         int n1 = text1.length();
        int n2 = text2.length();
        int[][] dp = new int[n1][n2];

        for (int[] row : dp) {
            Arrays.fill(row, -1);  // Initialize with -1 (uncomputed)
        }

        return helper(0, 0, text1, text2, dp);
    }
}

Comments

Popular posts from this blog

Two Sum II - Input Array Is Sorted

Comparable Vs. Comparator in Java

Increasing Triplet Subsequence