Bird
Raised Fist0
DSA C++programming~5 mins

Longest Common Substring in DSA C++ - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the Longest Common Substring problem?
It is the problem of finding the longest sequence of characters that appears in the same order and contiguously in two given strings.
Click to reveal answer
intermediate
How does the dynamic programming approach help solve the Longest Common Substring problem?
It builds a table where each cell represents the length of the longest common suffix of substrings ending at those positions, allowing us to find the maximum length efficiently.
Click to reveal answer
beginner
In the DP table for Longest Common Substring, what does a zero value in a cell mean?
It means the characters at the current positions in the two strings do not match, so there is no common substring ending there.
Click to reveal answer
intermediate
What is the time complexity of the dynamic programming solution for Longest Common Substring?
The time complexity is O(m*n), where m and n are the lengths of the two input strings.
Click to reveal answer
beginner
Why is Longest Common Substring different from Longest Common Subsequence?
Longest Common Substring requires the matching characters to be contiguous, while Longest Common Subsequence allows characters to be non-contiguous but in order.
Click to reveal answer
What does each cell in the DP table for Longest Common Substring represent?
ALength of longest common prefix starting at those positions
BLength of longest common suffix ending at those positions
CTotal number of matching characters so far
DLength of longest common subsequence so far
If characters at positions i and j in the two strings do not match, what is the DP cell value?
AZero
BOne
CMaximum of left and top cell
DPrevious cell value plus one
What is the main difference between Longest Common Substring and Longest Common Subsequence?
ABoth allow non-contiguous characters
BSubsequence requires contiguous characters, substring does not
CBoth require contiguous characters
DSubstring requires contiguous characters, subsequence does not
What is the time complexity of the DP solution for Longest Common Substring?
AO(m + n)
BO(m^2 * n^2)
CO(m * n)
DO(log(m * n))
Which of these is a correct step in the DP approach for Longest Common Substring?
AIf characters match, add 1 to the diagonal cell value
BIf characters match, add 1 to the left cell value
CIf characters match, add 1 to the top cell value
DIf characters match, reset cell to zero
Explain how to use dynamic programming to find the Longest Common Substring between two strings.
Think about building a table that stores lengths of matching suffixes.
You got /7 concepts.
    What is the difference between Longest Common Substring and Longest Common Subsequence? Give an example.
    Focus on whether characters must be next to each other or not.
    You got /5 concepts.

      Practice

      (1/5)
      1. What does the Longest Common Substring problem find between two strings s1 and s2?
      easy
      A. The longest sequence of characters that appear contiguously in both strings
      B. The longest sequence of characters that appear in both strings but not necessarily contiguously
      C. The total number of common characters between the two strings
      D. The longest string formed by concatenating both strings

      Solution

      1. Step 1: Understand the problem definition

        The Longest Common Substring problem looks for the longest continuous sequence of characters that appears in both strings without any breaks.
      2. Step 2: Differentiate from similar problems

        Unlike Longest Common Subsequence, which allows gaps, Longest Common Substring requires characters to be contiguous in both strings.
      3. Final Answer:

        The longest sequence of characters that appear contiguously in both strings -> Option A
      4. Quick Check:

        Longest Common Substring = contiguous matching characters [OK]
      Hint: Look for continuous matching characters in both strings [OK]
      Common Mistakes:
      • Confusing substring with subsequence
      • Thinking characters can be non-contiguous
      • Counting total common characters instead of longest continuous
      2. Which of the following C++ code snippets correctly initializes a 2D vector dp of size m+1 by n+1 with all zeros for Longest Common Substring?
      easy
      A. std::vector dp(m+1, std::vector<int>(n+1, 0));
      B. std::vector<int> dp(m+1, std::vector<int>(n+1, 0));
      C. std::vector dp(m, std::vector<int>(n));
      D. std::vector dp(m+1, n+1, 0);

      Solution

      1. Step 1: Understand 2D vector initialization syntax

        To create a 2D vector with m+1 rows and n+1 columns filled with zeros, use nested vector initialization.
      2. Step 2: Check each option

        std::vector dp(m+1, std::vector<int>(n+1, 0)); correctly creates a vector of vectors with m+1 rows, each row a vector of n+1 zeros. Others have syntax errors or wrong types.
      3. Final Answer:

        std::vector dp(m+1, std::vector<int>(n+1, 0)); -> Option A
      4. Quick Check:

        Correct 2D vector initialization = std::vector dp(m+1, std::vector<int>(n+1, 0)); [OK]
      Hint: Use nested vector constructor for 2D zero initialization [OK]
      Common Mistakes:
      • Using wrong vector types in initialization
      • Missing inner vector initialization
      • Trying to pass three arguments to vector constructor
      3. What is the output of the following C++ code snippet?
      std::string s1 = "abcdxyz";
      std::string s2 = "xyzabcd";
      int m = s1.size(), n = s2.size();
      std::vector dp(m+1, std::vector<int>(n+1, 0));
      int maxLen = 0;
      for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
          if (s1[i-1] == s2[j-1]) {
            dp[i][j] = dp[i-1][j-1] + 1;
            maxLen = std::max(maxLen, dp[i][j]);
          }
        }
      }
      std::cout << maxLen << std::endl;
      medium
      A. 3
      B. 4
      C. 1
      D. 0

      Solution

      1. Step 1: Trace matching substrings

        The longest common substring is "abcd" (length 4), which appears contiguously at the start of s1 and end of s2. "xyz" is length 3.
      2. Step 2: Check dp updates and maxLen

        dp updates length for matching characters. The longest continuous match found is length 4 for "abcd".
      3. Final Answer:

        4 -> Option B
      4. Quick Check:

        Longest common substring length = 4 [OK]
      Hint: Check continuous matching segments, not total matches [OK]
      Common Mistakes:
      • Confusing substring with subsequence length
      • Counting non-contiguous matches
      • Off-by-one errors in indexing
      4. Identify the bug in the following C++ code snippet for Longest Common Substring:
      std::string s1 = "abcde";
      std::string s2 = "abfde";
      int m = s1.size(), n = s2.size();
      std::vector dp(m+1, std::vector<int>(n+1, 0));
      int maxLen = 0;
      for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
          if (s1[i] == s2[j]) {
            dp[i][j] = dp[i-1][j-1] + 1;
            maxLen = std::max(maxLen, dp[i][j]);
          }
        }
      }
      std::cout << maxLen << std::endl;
      medium
      A. dp vector size should be (m+1) x (n+1) to avoid out-of-bound errors
      B. maxLen should be initialized to -1 instead of 0
      C. The loop indices should start from 0 instead of 1
      D. The comparison should be s1[i-1] == s2[j-1] instead of s1[i] == s2[j]

      Solution

      1. Step 1: Check string indexing inside loops

        Loop variables i and j start from 1, so to access string characters correctly, indices should be i-1 and j-1.
      2. Step 2: Identify the incorrect comparison

        The code compares s1[i] and s2[j], which causes out-of-bound access and wrong comparisons. It should be s1[i-1] == s2[j-1].
      3. Final Answer:

        The comparison should be s1[i-1] == s2[j-1] instead of s1[i] == s2[j] -> Option D
      4. Quick Check:

        Correct string indexing = i-1 and j-1 [OK]
      Hint: Use i-1 and j-1 to index strings when loops start at 1 [OK]
      Common Mistakes:
      • Accessing string with i or j directly causing out-of-bounds
      • Not initializing dp with correct size
      • Starting loops at wrong indices
      5. Given two strings s1 = "banana" and s2 = "ananas", write a C++ function to find the longest common substring and return it. What is the correct longest common substring?
      hard
      A. "anana"
      B. "nana"
      C. "ana"
      D. "ban"

      Solution

      1. Step 1: Understand the longest common substring candidates

        Check substrings common to both strings. "ana" (length 3) appears multiple times in both strings. "anana" is not a substring of both strings contiguously.
      2. Step 2: Verify other options

        "nana" length 4 is not a substring of s2; "ban" only in s1; "anana" is not a substring of s2.
      3. Final Answer:

        "ana" -> Option C
      4. Quick Check:

        Longest common substring between "banana" and "ananas" is "ana" [OK]
      Hint: Check all continuous matches, pick longest common substring [OK]
      Common Mistakes:
      • Choosing longest common subsequence instead of substring
      • Ignoring continuity requirement
      • Assuming longer substrings without verifying presence
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard