Substring Search Patterns in DSA Go - Time & Space Complexity
When searching for a smaller string inside a bigger one, we want to know how long it takes as the strings grow.
We ask: How does the search time change when the text or pattern gets longer?
Analyze the time complexity of the following code snippet.
func substringSearch(text, pattern string) int {
n := len(text)
m := len(pattern)
for i := 0; i <= n-m; i++ {
j := 0
for j < m && text[i+j] == pattern[j] {
j++
}
if j == m {
return i
}
}
return -1
}
This code checks each possible position in the text to see if the pattern matches starting there.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing characters of pattern with text at each position.
- How many times: Outer loop runs about (n - m + 1) times; inner loop runs up to m times per outer loop.
As text length (n) and pattern length (m) grow, the number of comparisons grows roughly by n times m.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 (m=3) | About 8 * 3 = 24 comparisons |
| 100 (m=5) | About 96 * 5 = 480 comparisons |
| 1000 (m=10) | About 991 * 10 = 9,910 comparisons |
Pattern observation: Operations grow roughly by multiplying text length and pattern length.
Time Complexity: O(n * m)
This means the time to search grows proportionally to the product of text length and pattern length.
[X] Wrong: "The search always takes time proportional to the text length only."
[OK] Correct: The pattern length matters too because each position may require checking multiple characters.
Understanding this helps you explain why simple search can be slow and why smarter methods exist, showing your grasp of algorithm efficiency.
"What if we used a more advanced algorithm like KMP? How would the time complexity change?"
Practice
strings.Contains(s, substr) function in Go do?Solution
Step 1: Understand the function purpose
strings.Containschecks if one string is inside another.Step 2: Check the return type
It returnstrueifsubstris found anywhere ins, otherwisefalse.Final Answer:
Checks if substr is present anywhere in s -> Option BQuick Check:
Contains means presence check = A [OK]
- Confusing Contains with Index or Replace functions
- Thinking it returns position instead of boolean
- Assuming it modifies the original string
"go" in string s using Go's standard library?Solution
Step 1: Recall Go's strings package functions
The correct function to find substring index isstrings.Index.Step 2: Check syntax correctness
The function is called asstrings.Index(s, "go"), returning the first index or -1 if not found.Final Answer:
index := strings.Index(s, "go") -> Option AQuick Check:
Index function in strings package = B [OK]
- Using methods on string variable directly (strings are not objects)
- Using Python or JavaScript syntax like find or IndexOf
- Calling non-existent functions like strings.Find
package main
import (
"fmt"
"strings"
)
func main() {
s := "hello golang"
pos := strings.Index(s, "go")
fmt.Println(pos)
}Solution
Step 1: Understand strings.Index behavior
It returns the first index where substring "go" appears in "hello golang".Step 2: Find substring position
Counting from 0: h(0) e(1) l(2) l(3) o(4) ' '(5) g(6) o(7)... So "go" starts at index 6.Final Answer:
6 -> Option AQuick Check:
Index of "go" in "hello golang" = 6 [OK]
- Counting from 1 instead of 0
- Assuming substring not found returns 0
- Confusing Index with Contains boolean
package main
import (
"fmt"
"strings"
)
func main() {
s := "golang"
if s.Contains("go") {
fmt.Println("Found")
}
}Solution
Step 1: Check method call on string variable
In Go, strings are not objects and do not have methods likeContainsdirectly.Step 2: Correct usage of Contains function
The correct call isstrings.Contains(s, "go")from the strings package, nots.Contains("go").Final Answer:
strings package has no Contains method on string variable -> Option DQuick Check:
Use strings.Contains(s, substr), not s.Contains(substr) [OK]
- Calling methods on string variables as if they were objects
- Forgetting to import strings package
- Assuming Contains returns index
words := []string{"go", "golang", "gopher", "gone"}, which code snippet correctly finds all words containing substring "go" and stores them in result?Solution
Step 1: Identify correct substring check
Usestrings.Contains(w, "go")to check if substring exists.Step 2: Append matching words to result slice
For each word containing "go", append it toresultslice.Final Answer:
var result []string for _, w := range words { if strings.Contains(w, "go") { result = append(result, w) } } -> Option CQuick Check:
Contains + append in loop = D [OK]
- Calling Contains as method on string variable
- Appending words that do NOT contain substring
- Checking Index == -1 instead of != -1
Ready to prove it?
Pass the test and this pattern moves unknown
