📖 Scenario: Imagine you are building a simple text comparison tool. You want to find the longest sequence of characters that appears in both texts exactly the same way. This is useful in spell checkers, plagiarism detectors, or DNA sequence analysis.
🎯 Goal: Build a program in C that finds the longest common substring between two given strings.
📋 What You'll Learn
Create two string variables with exact values
Create an integer variable to store the maximum length found
Use nested loops to compare substrings of both strings
Print the longest common substring found
💡 Why This Matters
🌍 Real World
Finding longest common substrings is useful in text comparison tools, DNA sequence analysis, and plagiarism detection.
💼 Career
Understanding string matching algorithms is important for software developers working on search engines, bioinformatics, and data cleaning.
Progress0 / 4 steps
1
Create the input strings
Create two string variables called str1 and str2 with these exact values: "abcdef" and "zabcf" respectively.
DSA C
Hint
Use double quotes to create string arrays in C.
2
Create variables for tracking longest substring
Create an integer variable called max_len and set it to 0. Also create an integer variable called end_index and set it to 0 to track the end position of the longest substring in str1.
DSA C
Hint
Use int to declare integer variables in C.
3
Find the longest common substring using nested loops
Use nested for loops with variables i and j to iterate over str1 and str2. Inside, use a while loop with variable length to count matching characters starting at i and j. Update max_len and end_index when a longer substring is found.
DSA C
Hint
Use nested loops to check every possible starting point in both strings.
Use a while loop to count matching characters.
4
Print the longest common substring
Print the longest common substring from str1 using max_len and end_index. Use a for loop with variable k to print characters from end_index - max_len + 1 to end_index. Then print a newline.
DSA C
Hint
Print characters from the start to end of the longest substring using putchar.
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 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 the two strings
D. The longest string formed by concatenating both strings
Solution
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 breaks (consecutively).
Step 2: Differentiate from similar problems
Unlike Longest Common Subsequence, which allows characters to be non-consecutive, Longest Common Substring requires consecutive matching characters.
Final Answer:
The longest sequence of characters that appear consecutively in both strings -> Option A
Quick Check:
Longest Common Substring = consecutive matching characters [OK]
Hint: Look for consecutive matching characters in both strings [OK]
Common Mistakes:
Confusing substring with subsequence
Thinking characters can be non-consecutive
Counting total common characters instead of longest consecutive
2. Which of the following C code snippets correctly initializes a 2D array dp of size m+1 by n+1 with all zeros for Longest Common Substring?
easy
A. int dp[m+1][n+1] = {0};
B. int dp[m+1][n+1]; memset(dp, 0, sizeof(dp));
C. int dp[m][n]; for(int i=0;i
D. int dp[m+1][n+1]; for(int i=0;i<=m;i++) for(int j=0;j<=n;j++) dp[i][j] = -1;
Solution
Step 1: Understand array initialization in C
To initialize a 2D array with zeros, we can declare it and then use memset to set all bytes to zero.
Step 2: Analyze each option
int dp[m+1][n+1] = {0}; tries to initialize with {0} but this only works for fixed size arrays, not variable sizes. int dp[m+1][n+1]; memset(dp, 0, sizeof(dp)); declares and uses memset correctly. int dp[m][n]; for(int i=0;i
Final Answer:
int dp[m+1][n+1]; memset(dp, 0, sizeof(dp)); -> Option B
Quick Check:
Use memset to zero initialize arrays in C [OK]
Hint: Use memset to zero initialize arrays in C [OK]
Common Mistakes:
Using {0} for variable size arrays
Initializing with wrong values like 1 or -1
Not initializing dp array before use
3. What is the output of the following C code snippet that finds the length of the longest common substring between s1 = "abcde" and s2 = "abfde"?
int longestCommonSubstring(char* s1, char* s2) {
int m = strlen(s1), n = strlen(s2);
int dp[m+1][n+1];
memset(dp, 0, sizeof(dp));
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;
}
}
}
return maxLen;
}
int main() {
printf("%d", longestCommonSubstring("abcde", "abfde"));
return 0;
}
medium
A. 2
B. 3
C. 4
D. 5
Solution
Step 1: Trace matching characters between s1 and s2
Strings: s1 = "abcde", s2 = "abfde". Matching consecutive characters are "ab" at start and "de" at end. "ab" length = 2, "de" length = 2. The longest common substring length is 2.
Step 2: Check dp updates for longest substring
At i=3, j=3, characters differ ('c' vs 'f'), so dp resets. The longest substring is "ab" or "de" with length 2.
Final Answer:
2 -> Option A
Quick Check:
Longest Common Substring length = 2 [OK]
Hint: Check consecutive matching chars, reset on mismatch [OK]
Common Mistakes:
Counting non-consecutive matches
Confusing substring length with subsequence length
Off-by-one errors in indexing
4. The following code attempts to find the longest common substring length but has a bug. What is the bug?
int longestCommonSubstring(char* s1, char* s2) {
int m = strlen(s1), n = strlen(s2);
int dp[m][n];
int maxLen = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (s1[i] == s2[j]) {
dp[i][j] = dp[i-1][j-1] + 1;
if (dp[i][j] > maxLen) maxLen = dp[i][j];
} else {
dp[i][j] = 0;
}
}
}
return maxLen;
}
medium
A. dp array is not initialized before use
B. The loop indices should start from 1 instead of 0
C. The maxLen variable is not updated correctly
D. dp array size should be (m+1) x (n+1) to avoid out-of-bound access
Solution
Step 1: Analyze dp array size and indexing
The dp array is declared as dp[m][n], but the code accesses dp[i-1][j-1] which can cause out-of-bound access when i=0 or j=0.
Step 2: Correct dp array size and indexing
To safely access dp[i-1][j-1], dp should be sized (m+1) x (n+1) and loops should run from 1 to m and 1 to n, with dp[0][*] and dp[*][0] initialized to 0.
Final Answer:
dp array size should be (m+1) x (n+1) to avoid out-of-bound access -> Option D
Quick Check:
Use dp size (m+1)x(n+1) for safe indexing [OK]
Hint: Use dp size (m+1)x(n+1) to avoid negative indices [OK]
Common Mistakes:
Using dp size m x n causing index errors
Starting loops at 0 but accessing dp[i-1][j-1]
Not initializing dp array elements
5. Given two strings s1 = "banana" and s2 = "ananas", write a C function to find the longest common substring and return its length. What is the length of the longest common substring?
hard
A. 5
B. 4
C. 3
D. 6
Solution
Step 1: Identify common substrings between s1 and s2
Check substrings of s1 and s2. Common substrings include "ana", "nan", "ana" again, and the longest is "ana" with length 3.
Step 2: Confirm no longer substring exists
No substring longer than 3 exists in both strings consecutively. "anana" is not a substring of "banana" starting at index 1 (it's "anana" in s2 but not in s1 consecutively).
Final Answer:
3 -> Option C
Quick Check:
Longest common substring between "banana" and "ananas" is "ana" length 3 [OK]
Hint: Look for "ana" substring in both strings [OK]
Common Mistakes:
Confusing substring with subsequence
Assuming "anana" is common substring
Stopping at shorter matches like "an"
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.