The Longest Common Subsequence is the longest sequence of characters that appear in the same order (not necessarily contiguous) in two given sequences.
Click to reveal answer
beginner
How does the LCS problem differ from the Longest Common Substring problem?
LCS allows characters to be non-contiguous but in order, while Longest Common Substring requires characters to be contiguous in both sequences.
Click to reveal answer
intermediate
What is the time complexity of the classic dynamic programming solution for LCS?
The time complexity is O(m * n), where m and n are the lengths of the two input sequences.
Click to reveal answer
intermediate
In the LCS dynamic programming table, what does each cell represent?
Each cell represents the length of the LCS of the prefixes of the two sequences up to that point.
Click to reveal answer
advanced
How do you reconstruct the LCS from the dynamic programming table?
Start from the bottom-right cell and move backwards: if characters match, include it and move diagonally; else move in the direction of the larger value (up or left).
Click to reveal answer
What does the Longest Common Subsequence problem find?
AThe longest sequence appearing in reverse order
BThe longest contiguous substring common to both strings
CThe shortest sequence common to both strings
DThe longest sequence appearing in both strings in order, not necessarily contiguous
✗ Incorrect
LCS finds the longest sequence that appears in both strings in the same order but not necessarily next to each other.
What is the base case value in the LCS dynamic programming table for empty prefixes?
A1
B0
C-1
DLength of the other string
✗ Incorrect
When one string prefix is empty, the LCS length is 0.
If characters at current positions match, how is the LCS table value updated?
AAdd 1 to the diagonal cell value
BTake the maximum of left and top cells
CSet to zero
DAdd 1 to the left cell value
✗ Incorrect
Matching characters add 1 to the LCS length from the previous diagonal cell.
What is the space complexity of the classic LCS dynamic programming approach?
AO(m * n)
BO(m + n)
CO(1)
DO(max(m, n))
✗ Incorrect
The DP table stores values for all pairs of prefixes, requiring O(m * n) space.
Which of these is NOT a valid step when reconstructing the LCS from the DP table?
AMove diagonally if characters match
BMove up if top cell is larger
CSkip cells with zero values
DMove left if left cell is larger
✗ Incorrect
Skipping zero cells is not a reconstruction step; reconstruction follows the path of maximum values.
Explain how the dynamic programming table for LCS is built and what each cell represents.
Think about prefixes and how matching or non-matching characters affect the table.
You got /5 concepts.
Describe the process to reconstruct the actual longest common subsequence from the completed DP table.
Follow the path of decisions made during table filling.
You got /5 concepts.
Practice
(1/5)
1. What does the Longest Common Subsequence (LCS) between two strings represent?
easy
A. The longest substring that appears exactly the same in both strings.
B. The longest sequence of characters that appear in both strings in the same order, but not necessarily consecutively.
C. The shortest sequence that can be formed by combining both strings.
D. The total number of characters in both strings combined.
Solution
Step 1: Understand the definition of LCS
The LCS is the longest sequence that appears in both strings in the same order, but characters do not need to be next to each other.
Step 2: Differentiate from substring
A substring requires characters to be consecutive, but LCS allows gaps.
Final Answer:
The longest sequence of characters that appear in both strings in the same order, but not necessarily consecutively. -> Option B
Quick Check:
LCS = longest ordered sequence [OK]
Hint: LCS is about order, not consecutive characters [OK]
Common Mistakes:
Confusing LCS with longest substring
Thinking LCS characters must be consecutive
Mixing LCS with string concatenation
2. Which of the following Go function signatures correctly represents a function to compute the length of the LCS of two strings s1 and s2?
easy
A. func lcs(s1, s2 string) int
B. func lcs(s1, s2 int) string
C. func lcs(s1, s2 []int) int
D. func lcs(s1, s2 string) string
Solution
Step 1: Identify input types for LCS function
The LCS function takes two strings as input, so parameters should be of type string.
Step 2: Identify output type for LCS function
The function returns the length of the LCS, which is an integer.
Final Answer:
func lcs(s1, s2 string) int -> Option A
Quick Check:
Input strings, output int length [OK]
Hint: LCS inputs are strings, output is integer length [OK]
Common Mistakes:
Using wrong input types like int or slices
Returning string instead of length
Mixing input and output types
3. What is the output of the following Go code snippet?
package main
import "fmt"
func lcs(s1, s2 string) int {
m, n := len(s1), len(s2)
dp := make([][]int, m+1)
for i := range dp {
dp[i] = make([]int, n+1)
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if s1[i-1] == s2[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
if dp[i-1][j] > dp[i][j-1] {
dp[i][j] = dp[i-1][j]
} else {
dp[i][j] = dp[i][j-1]
}
}
}
}
return dp[m][n]
}
func main() {
fmt.Println(lcs("AGGTAB", "GXTXAYB"))
}
medium
A. 4
B. 5
C. 6
D. 7
Solution
Step 1: Understand the input strings
Strings are "AGGTAB" and "GXTXAYB". We find their LCS length using dynamic programming.
Step 2: Trace the LCS calculation
The LCS is "GTAB" which has length 4, but checking carefully the code and strings, the LCS is actually "GTAB" (length 4) or "GTTAB"? The correct LCS is "GTAB" length 4 or "GTAB" length 4? Actually, the LCS is "GTAB" length 4. But the code returns 4 or 5? Let's check carefully: The LCS is "GTAB" (G T A B) length 4. But the code returns dp[m][n], which is 4. But options have 4 and 5. Let's verify carefully: The LCS is "GTAB" length 4. So output is 4.
Final Answer:
4 -> Option A
Quick Check:
LCS length of "AGGTAB" and "GXTXAYB" = 4 [OK]
Hint: Trace DP table or recall classic LCS example [OK]
Common Mistakes:
Confusing LCS length with longest substring length
Off-by-one errors in indexing
Misreading input strings
4. The following Go code attempts to compute the LCS length but has a bug. What is the bug?
func lcs(s1, s2 string) int {
m, n := len(s1), len(s2)
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if s1[i-1] == s2[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
if dp[i-1][j] > dp[i][j-1] {
dp[i][j] = dp[i-1][j]
} else {
dp[i][j] = dp[i][j-1]
}
}
}
}
return dp[m-1][n-1]
}
medium
A. The return statement should be dp[m][n] instead of dp[m-1][n-1].
B. The loops should start from 0 instead of 1.
C. The dp slice is not initialized with size m+1 and n+1, causing index out of range errors.
D. The comparison s1[i-1] == s2[j-1] should be s1[i] == s2[j].
Solution
Step 1: Check dp slice initialization
The dp slice is created with size m and n, but the loops access dp[i][j] for i and j up to m and n inclusive, causing index out of range errors.
Step 2: Correct dp size for safe indexing
dp should be initialized with size m+1 and n+1 to safely access dp[i][j] where i and j go up to m and n.
Final Answer:
The dp slice is not initialized with size m+1 and n+1, causing index out of range errors. -> Option C
Quick Check:
dp size must be m+1 x n+1 [OK]
Hint: dp size must cover all indices used in loops [OK]
Common Mistakes:
Initializing dp with size m and n instead of m+1 and n+1
Starting loops at 1 but dp size too small
Incorrect return index
5. Given two strings s1 = "ABCBDAB" and s2 = "BDCABA", write a Go function that returns the actual Longest Common Subsequence string, not just its length. Which approach correctly reconstructs the LCS from the DP table?
hard
A. Sort both strings and find common characters in sorted order.
B. Build the DP table and return dp[m][n] as the LCS string directly.
C. Use recursion without memoization to find the LCS string.
D. Build the DP table for LCS length, then backtrack from dp[m][n] moving diagonally when characters match, else move in direction of larger dp value.
Solution
Step 1: Build DP table for LCS length
Use dynamic programming to fill dp table with lengths of LCS for substrings of s1 and s2.
Step 2: Backtrack to reconstruct LCS string
Start from dp[m][n], move diagonally up-left if characters match (add character to result), else move in direction of larger dp value until reaching dp[0][0].
Final Answer:
Build the DP table for LCS length, then backtrack from dp[m][n] moving diagonally when characters match, else move in direction of larger dp value. -> Option D
Quick Check:
DP + backtracking reconstructs LCS string [OK]
Hint: Backtrack DP table diagonally on matches to get LCS string [OK]
Common Mistakes:
Returning dp[m][n] as string instead of length
Not backtracking to reconstruct sequence
Sorting strings loses original order
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.