What is the main goal of substring search algorithms?
To find the position(s) where a smaller string (pattern) appears within a larger string (text).
Click to reveal answer
beginner
Explain the naive substring search approach.
It checks every possible position in the text to see if the pattern matches, moving one character at a time.
Click to reveal answer
intermediate
What is the key idea behind the Knuth-Morris-Pratt (KMP) algorithm?
KMP uses a precomputed table to skip unnecessary comparisons by remembering how the pattern matches against itself.
Click to reveal answer
intermediate
What does the prefix function (also called 'lps' array) represent in KMP?
It stores the length of the longest proper prefix of the pattern that is also a suffix for each prefix of the pattern.
Click to reveal answer
intermediate
Why is KMP more efficient than the naive approach?
Because it avoids rechecking characters that have already been matched, leading to a time complexity of O(n + m) instead of O(n*m).
Click to reveal answer
What does the naive substring search algorithm do when a mismatch occurs?
AMoves the pattern backward
BMoves the pattern one character forward in the text and starts matching from the beginning of the pattern
CStops searching immediately
DSkips multiple characters based on a precomputed table
✗ Incorrect
The naive approach moves the pattern one character forward and restarts matching from the first character.
Which data structure is essential for the KMP algorithm to avoid redundant comparisons?
APrefix function (lps array)
BStack
CQueue
DHash map
✗ Incorrect
The prefix function (lps array) helps KMP skip unnecessary comparisons.
What is the worst-case time complexity of the naive substring search?
AO(n + m)
BO(n)
CO(m)
DO(n * m)
✗ Incorrect
Naive search can take O(n * m) time in the worst case, where n is text length and m is pattern length.
In KMP, what does a value of 0 in the prefix function mean for a position in the pattern?
ANo proper prefix matches a suffix ending at that position
BThe entire pattern matches
CThe pattern is empty
DThe pattern repeats fully
✗ Incorrect
A 0 means no proper prefix is also a suffix for that prefix of the pattern.
Which substring search algorithm is best for very large texts and patterns?
ABubble sort
BNaive search
CKMP algorithm
DLinear search
✗ Incorrect
KMP is efficient for large texts and patterns due to its linear time complexity.
Describe how the KMP algorithm uses the prefix function to improve substring search.
Think about how KMP remembers pattern structure to skip ahead.
You got /4 concepts.
Explain the difference between naive substring search and KMP in terms of efficiency and approach.
Focus on how each handles mismatches.
You got /4 concepts.
Practice
(1/5)
1. What does the indexOf method in Java's String class return when searching for a substring that exists in the string?
easy
A. The starting index of the first occurrence of the substring
B. The length of the substring
C. The number of times the substring appears
D. A boolean indicating if the substring exists
Solution
Step 1: Understand the purpose of indexOf
The indexOf method searches for the first occurrence of a substring inside a string and returns its position.
Step 2: Identify the return value when substring exists
If the substring is found, indexOf returns the starting index (0-based) of that substring in the string.
Final Answer:
The starting index of the first occurrence of the substring -> Option A
Quick Check:
indexOf returns index, not count or boolean [OK]
Hint: Remember: indexOf returns position, not count or boolean [OK]
Common Mistakes:
Thinking indexOf returns count of occurrences
Assuming it returns true/false
Confusing indexOf with substring length
2. Which of the following is the correct syntax to find the first occurrence of substring "cat" in string str in Java?
easy
A. int pos = str.find("cat");
B. int pos = str.search("cat");
C. int pos = str.indexOf("cat");
D. int pos = str.contains("cat");
Solution
Step 1: Recall Java String methods for substring search
Java's String class uses indexOf to find substring positions.
Step 2: Check method names and return types
find and search are not valid String methods; contains returns boolean, not int.
Final Answer:
int pos = str.indexOf("cat"); -> Option C
Quick Check:
Use indexOf for substring position [OK]
Hint: Use indexOf for position, contains for boolean check [OK]
Common Mistakes:
Using non-existent methods like find or search
Using contains which returns boolean, not index
Confusing method names from other languages
3. What is the output of the following Java code?
String text = "hello world";
int pos = text.indexOf("lo");
System.out.println(pos);
medium
A. -1
B. 3
C. 4
D. 5
Solution
Step 1: Locate substring "lo" in "hello world"
Counting indices: h(0), e(1), l(2), l(3), o(4). The substring "lo" starts at index 3 (l at 3, o at 4).
Step 2: Understand indexOf return value
indexOf returns the starting index of the substring, which is 3 here.
Final Answer:
3 -> Option B
Quick Check:
Substring "lo" starts at index 3 [OK]
Hint: Count string indices from 0 to find substring start [OK]
Common Mistakes:
Counting from 1 instead of 0
Returning index of second character in substring
Assuming -1 means substring found
4. Identify the error in the following Java code snippet for substring search:
String s = "banana";
int index = s.indexOf('an');
System.out.println(index);
medium
A. Using single quotes for substring instead of double quotes
B. Missing semicolon after indexOf call
C. indexOf method does not exist for String
D. Printing index before assignment
Solution
Step 1: Check substring argument type in indexOf
The indexOf method expects a String argument, but single quotes denote a char.
Step 2: Identify correct syntax for substring
Substring literals must be in double quotes, so 'an' should be "an".
Final Answer:
Using single quotes for substring instead of double quotes -> Option A
Quick Check:
Substring literals need double quotes [OK]
Hint: Use double quotes for substrings, single for chars [OK]
Common Mistakes:
Using single quotes for multi-character substrings
Confusing char and String types
Ignoring compiler error messages
5. Given a string text, which code snippet correctly finds all starting indices of substring "ab" in text using indexOf?
hard
A. int index = 0;
while (index < text.length()) {
index = text.indexOf("ab");
System.out.print(index + " ");
index++;
}
B. for (int i = 0; i < text.length(); i++) {
if (text.indexOf("ab") == i) System.out.print(i + " ");
}
C. int index = text.indexOf("ab");
while (index != -1) {
System.out.print(index + " ");
index = text.indexOf("ab");
}
D. int index = 0;
while ((index = text.indexOf("ab", index)) != -1) {
System.out.print(index + " ");
index++;
}
Solution
Step 1: Understand how to find multiple occurrences with indexOf
Use indexOf(substring, fromIndex) to search from a moving start index to find all occurrences.
Step 2: Analyze each option's logic
int index = 0;
while ((index = text.indexOf("ab", index)) != -1) {
System.out.print(index + " ");
index++;
} correctly updates index after each found occurrence to avoid infinite loop and find all positions. Others either do not update index properly or repeatedly search from start.
Final Answer:
int index = 0;
while ((index = text.indexOf("ab", index)) != -1) {
System.out.print(index + " ");
index++;
} -> Option D
Quick Check:
Use indexOf with start index and increment after each find [OK]
Hint: Increment start index after each found substring to continue search [OK]
Common Mistakes:
Not updating start index causing infinite loop
Always searching from start index 0
Confusing indexOf usage with for-loop index
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.