BackmediumStrings

Identify Prolonged String Overlap Solution

Problem Statement

Identify Prolonged String Overlap

You are given two strings, S and T, each consisting of uppercase English letters. Your task is to compute the length of the longest subsequence that appears in both strings. A subsequence is a sequence that can be derived from a string by deleting zero or more characters without changing the order of the remaining characters. The subsequence need not be contiguous.

Input format:

  • The first line contains the string S.
  • The second line contains the string T.

Output format:

  • Output a single integer: the length of the longest common subsequence of S and T.

The strings may be up to 1000 characters long, so an algorithm with quadratic time complexity is acceptable.

Example 1
Input
AGGTAB GXTXAYB
Output
4

Explanation: The longest common subsequence is "GTAB". 1) G matches G, 2) T matches T, 3) A matches A, 4) B matches B. No longer subsequence exists, so the length is 4.

Example 2
Input
ABCDEF FBDAMN
Output
2

Explanation: The common subsequence "BD" has length 2. 1) B from S matches B from T, 2) D from S matches D from T. No longer subsequence can be formed.

Example 3
Input
AAAA AA
Output
2

Explanation: Both strings contain only the letter A. The longest common subsequence is "AA", length 2.

Example 4
Input
XYZ ABC
Output
0

Explanation: There are no common characters, so the longest common subsequence has length 0.

Constraints

  • 1 <= |S|, |T| <= 1000
  • S and T consist only of uppercase English letters (A–Z)
  • Time limit: 1 second
  • Memory limit: 256 MB
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Identify Prolonged String Overlap — Problem Statement & Solution Guide

StringsMediumLongest Common Subsequence
TimeO(|S|·|T|)
|
SpaceO(min(|S|,|T|))

Problem Description

Identify Prolonged String Overlap

You are given two strings, S and T, each consisting of uppercase English letters. Your task is to compute the length of the longest subsequence that appears in both strings. A subsequence is a sequence that can be derived from a string by deleting zero or more characters without changing the order of the remaining characters. The subsequence need not be contiguous.

Input format:

- The first line contains the string S.

- The second line contains the string T.

Output format:

- Output a single integer: the length of the longest common subsequence of S and T.

The strings may be up to 1000 characters long, so an algorithm with quadratic time complexity is acceptable.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Identify Prolonged String Overlap"

medium

WHY DOES IT MATTER?

The LCS pattern is foundational for sequence alignment, diff tools, and pattern matching. It teaches how to transform an exponential search into a polynomial DP by recognizing overlapping subproblems and optimal substructure.

OPTIMIZATION CHALLENGE

The critical insight is that each dp cell depends only on its left, top, and top‑left neighbors, allowing us to keep just two rows (or a single rolling array) and reduce memory from O(n·m) to O(min(n,m)).

REAL-WORLD CONNECTION

Version control systems compute diffs between file versions using LCS to highlight added or removed lines, ensuring minimal changes are shown to developers.

When implementing, always initialize the first row and column to zero, use 1‑based indices for clarity, and avoid string concatenation inside loops to keep the algorithm fast.

COMPLEXITY AT A GLANCE

⏱ Time:O(|S|·|T|)
💾 Space:O(min(|S|,|T|))

Core Theory — Why This Approach?

The longest common subsequence (LCS) problem asks for the maximum length of a sequence that can be derived from both input strings by deleting characters while preserving order. A naive approach would enumerate all subsequences of one string (2^n possibilities) and check membership in the other, leading to exponential time and infeasible for lengths beyond 20.

Dynamic programming provides an optimal solution by exploiting optimal substructure: the LCS of prefixes S[0..i-1] and T[0..j-1] depends only on smaller prefixes. Define dp[i][j] as the LCS length of S[0..i-1] and T[0..j-1]. The recurrence is:

- If S[i-1] == T[j-1], then dp[i][j] = dp[i-1][j-1] + 1.

- Otherwise, dp[i][j] = max(dp[i-1][j], dp[i][j-1]).

By filling a table of size (|S|+1)×(|T|+1) iteratively, we achieve O(|S|·|T|) time and space.

Further optimizations reduce space to O(min(|S|,|T|)) by keeping only two rows (current and previous) or a single rolling array, because each dp[i][j] depends only on the previous row and the current row’s left neighbor.

Interview Questions on This Problem

Q1How would you modify the LCS algorithm to handle very long strings where memory is limited?

Use a space‑optimized DP that keeps only two rows (or a single row with careful updates). If even that is too large, apply Hirschberg’s algorithm, which recursively splits the problem and reconstructs the LCS in O(n·m) time and O(min(n,m)) space.

Q2A fintech platform needs to detect duplicate transaction sequences across logs. Which algorithmic pattern from LCS would you apply and why?

Treat each log as a string of transaction IDs and compute the LCS to find the longest common subsequence of operations. This pattern is useful because it tolerates missing or reordered entries, similar to how fraud detection tolerates noise.

Q3During a coding interview at a high‑growth startup, you’re asked to find the longest common subsequence of two DNA strands. What key insight would you emphasize to the interviewer?

Emphasize that the problem reduces to a classic DP with O(n·m) time, but you can optimize space to O(min(n,m)) and that the recurrence is simple: match adds one, otherwise take the max of adjacent subproblems.

Examples

Example 1

Input

AGGTAB
GXTXAYB

Output

4

Explanation: The longest common subsequence is "GTAB". 1) G matches G, 2) T matches T, 3) A matches A, 4) B matches B. No longer subsequence exists, so the length is 4.

Example 2

Input

ABCDEF
FBDAMN

Output

2

Explanation: The common subsequence "BD" has length 2. 1) B from S matches B from T, 2) D from S matches D from T. No longer subsequence can be formed.

Example 3

Input

AAAA
AA

Output

2

Explanation: Both strings contain only the letter A. The longest common subsequence is "AA", length 2.

Example 4

Input

XYZ
ABC

Output

0

Explanation: There are no common characters, so the longest common subsequence has length 0.

Constraints

  • 1 <= |S|, |T| <= 1000
  • S and T consist only of uppercase English letters (A–Z)
  • Time limit: 1 second
  • Memory limit: 256 MB

Optimal Approach & Strategy

Use a 2‑D DP table where dp[i][j] = dp[i-1][j-1]+1 if S[i-1]==T[j-1], else max(dp[i-1][j], dp[i][j-1]). Fill the table iteratively in O(n·m) time and reduce space to O(min(n,m)).

Brute Force Approach

Generate all subsequences of one string (2^n possibilities) and check if each appears in the other string. This exponential approach quickly becomes infeasible as string length grows.

Verified Code Solutions

JavaScript Solution
Time: O(|S|·|T|)
function longestCommonSubsequence(s1, s2) {
   const m = s1.length;
   const n = s2.length;
   const dp = Array(m + 1).fill(0).map(() => Array(n + 1).fill(0));
   for (let i = 1; i <= m; i++) {
       for (let j = 1; j <= n; j++) {
           if (s1[i - 1] === s2[j - 1]) {
               dp[i][j] = dp[i - 1][j - 1] + 1;
           } else {
               dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
           }
       }
   }
   return dp[m][n];
}

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.