Bird
Raised Fist0
DSA C#programming~20 mins

Longest Common Substring in DSA C# - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Longest Common Substring Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Longest Common Substring Length Calculation
What is the output of the following C# code that calculates the length of the longest common substring between two strings?
DSA C#
using System;

class Program {
    static int LongestCommonSubstring(string s1, string s2) {
        int maxLen = 0;
        int[,] dp = new int[s1.Length + 1, s2.Length + 1];
        for (int i = 1; i <= s1.Length; i++) {
            for (int j = 1; j <= s2.Length; j++) {
                if (s1[i - 1] == s2[j - 1]) {
                    dp[i, j] = dp[i - 1, j - 1] + 1;
                    if (dp[i, j] > maxLen) maxLen = dp[i, j];
                }
            }
        }
        return maxLen;
    }

    static void Main() {
        Console.WriteLine(LongestCommonSubstring("ababc", "babca"));
    }
}
A5
B3
C4
D2
Attempts:
2 left
💡 Hint
Trace the matching characters and their consecutive lengths.
❓ Predict Output
intermediate
2:00remaining
Longest Common Substring Result String
What substring does the following C# code print as the longest common substring between two strings?
DSA C#
using System;

class Program {
    static string LongestCommonSubstring(string s1, string s2) {
        int maxLen = 0, endIndex = 0;
        int[,] dp = new int[s1.Length + 1, s2.Length + 1];
        for (int i = 1; i <= s1.Length; i++) {
            for (int j = 1; j <= s2.Length; j++) {
                if (s1[i - 1] == s2[j - 1]) {
                    dp[i, j] = dp[i - 1, j - 1] + 1;
                    if (dp[i, j] > maxLen) {
                        maxLen = dp[i, j];
                        endIndex = i - 1;
                    }
                }
            }
        }
        return s1.Substring(endIndex - maxLen + 1, maxLen);
    }

    static void Main() {
        Console.WriteLine(LongestCommonSubstring("abcdef", "zabcf"));
    }
}
Aabc
Babcf
Cbc
Dz
Attempts:
2 left
💡 Hint
Look for the longest continuous matching substring.
❓ Predict Output
advanced
2:00remaining
Longest Common Substring Length with Empty String
What is the output of this C# code when one input string is empty?
DSA C#
using System;

class Program {
    static int LongestCommonSubstring(string s1, string s2) {
        int maxLen = 0;
        int[,] dp = new int[s1.Length + 1, s2.Length + 1];
        for (int i = 1; i <= s1.Length; i++) {
            for (int j = 1; j <= s2.Length; j++) {
                if (s1[i - 1] == s2[j - 1]) {
                    dp[i, j] = dp[i - 1, j - 1] + 1;
                    if (dp[i, j] > maxLen) maxLen = dp[i, j];
                }
            }
        }
        return maxLen;
    }

    static void Main() {
        Console.WriteLine(LongestCommonSubstring("", "abc"));
    }
}
AThrows an exception
B0
C1
D3
Attempts:
2 left
💡 Hint
Consider what happens when one string has no characters.
🧠 Conceptual
advanced
1:30remaining
Time Complexity of Longest Common Substring Algorithm
What is the time complexity of the dynamic programming solution to find the longest common substring of two strings of lengths m and n?
AO(m * n)
BO(m + n)
CO(m^2 * n^2)
DO(max(m, n))
Attempts:
2 left
💡 Hint
Consider the nested loops over both strings.
❓ Predict Output
expert
2:30remaining
Longest Common Substring with Repeated Characters
What is the output of this C# code that finds the longest common substring between two strings with repeated characters?
DSA C#
using System;

class Program {
    static string LongestCommonSubstring(string s1, string s2) {
        int maxLen = 0, endIndex = 0;
        int[,] dp = new int[s1.Length + 1, s2.Length + 1];
        for (int i = 1; i <= s1.Length; i++) {
            for (int j = 1; j <= s2.Length; j++) {
                if (s1[i - 1] == s2[j - 1]) {
                    dp[i, j] = dp[i - 1, j - 1] + 1;
                    if (dp[i, j] > maxLen) {
                        maxLen = dp[i, j];
                        endIndex = i - 1;
                    }
                }
            }
        }
        return s1.Substring(endIndex - maxLen + 1, maxLen);
    }

    static void Main() {
        Console.WriteLine(LongestCommonSubstring("aaabaaa", "baaaab"));
    }
}
Aaab
Baaa
Cbaaa
Daaab
Attempts:
2 left
💡 Hint
Check the longest continuous matching substring carefully.

Practice

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

Solution

  1. Step 1: Understand the problem definition

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

    Unlike Longest Common Subsequence, substrings must be continuous in both strings.
  3. Final Answer:

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

    Longest Common Substring = consecutive matching characters [OK]
Hint: Look for continuous matching characters in both strings [OK]
Common Mistakes:
  • Confusing substring with subsequence
  • Thinking characters can be non-continuous
  • Counting total common characters instead of longest sequence
2. Which of the following C# code snippets correctly initializes a 2D array for dynamic programming in Longest Common Substring?
easy
A. int[][] dp = new int[m][n];
B. int[,] dp = new int[m][n];
C. int[,] dp = new int[m + 1, n + 1];
D. int[][] dp = new int[m + 1, n + 1];

Solution

  1. Step 1: Recall C# syntax for 2D arrays

    In C#, a rectangular 2D array is declared as int[,] with sizes specified in new int[m + 1, n + 1].
  2. Step 2: Check each option

    int[,] dp = new int[m + 1, n + 1]; uses correct syntax. Options A and D mix jagged and rectangular array syntax incorrectly. int[,] dp = new int[m][n]; uses wrong initialization syntax.
  3. Final Answer:

    int[,] dp = new int[m + 1, n + 1]; -> Option C
  4. Quick Check:

    Rectangular 2D array syntax = int[,] dp = new int[m + 1, n + 1]; [OK]
Hint: Use int[,] for 2D arrays, not jagged arrays for DP [OK]
Common Mistakes:
  • Using jagged array syntax incorrectly
  • Missing +1 for boundary conditions
  • Mixing rectangular and jagged array syntax
3. What is the output of the following C# code snippet?
string s1 = "abcde";
string s2 = "abfde";
int m = s1.Length;
int n = s2.Length;
int[,] dp = new int[m + 1, n + 1];
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;
if (dp[i, j] > maxLen) maxLen = dp[i, j];
} else {
dp[i, j] = 0;
}
}
}
Console.WriteLine(maxLen);
medium
A. 2
B. 3
C. 4
D. 1

Solution

  1. Step 1: Trace matching characters between s1 and s2

    Strings: s1 = "abcde", s2 = "abfde". Matching substrings are "ab" at start and "de" at end, both length 2.
  2. Step 2: Identify longest common substring length

    Longest common substring length is 2, either "ab" or "de".
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Longest common substring length = 2 [OK]
Hint: Check continuous matching chars, not total matches [OK]
Common Mistakes:
  • Counting non-continuous matches
  • Confusing substring length with subsequence length
  • Off-by-one errors in indexing
4. Identify the bug in this Longest Common Substring C# code snippet:
string s1 = "hello";
string s2 = "yellow";
int m = s1.Length;
int n = s2.Length;
int[,] dp = new int[m, n];
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;
if (dp[i, j] > maxLen) maxLen = dp[i, j];
} else {
dp[i, j] = 0;
}
}
}
Console.WriteLine(maxLen);
medium
A. The comparison should be s1[i] == s2[j] without -1
B. The dp array size should be (m+1, n+1) to avoid index errors
C. The loops should start from 0 instead of 1
D. maxLen should be initialized to -1

Solution

  1. Step 1: Check dp array size and indexing

    dp is declared as int[m, n], but loops access dp[i, j] with i and j up to m and n, causing index out of range.
  2. Step 2: Correct dp size for safe indexing

    dp should be int[m+1, n+1] to allow indices from 0 to m and 0 to n safely.
  3. Final Answer:

    The dp array size should be (m+1, n+1) to avoid index errors -> Option B
  4. Quick Check:

    dp size = (m+1, n+1) for safe indexing [OK]
Hint: Add +1 to dp array size for boundary indexing [OK]
Common Mistakes:
  • Using dp size without +1 causes runtime errors
  • Starting loops at 0 causes negative indexing
  • Incorrect character indexing without -1
5. Given two strings s1 = "xabxac" and s2 = "abcabxabcd", what is the length of their longest common substring?
hard
A. 3
B. 6
C. 5
D. 4

Solution

  1. Step 1: Identify common substrings between s1 and s2

    Check substrings like "abx", "bxa", "xab", "abxa". The longest common substring is "abxa" with length 4.
  2. Step 2: Confirm no longer substring exists

    "abxac" is in s1 but not fully in s2 consecutively. So length 4 is maximum.
  3. Final Answer:

    4 -> Option D
  4. Quick Check:

    Longest common substring length = 4 [OK]
Hint: Look for longest continuous matching sequence [OK]
Common Mistakes:
  • Counting subsequence instead of substring
  • Overestimating length by including non-continuous chars
  • Ignoring overlapping substrings
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