Bird
Raised Fist0
DSA Cprogramming~5 mins

String Pattern Matching Naive in DSA C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: String Pattern Matching Naive
O(n * m)
Understanding Time Complexity

We want to understand how the time needed to find a pattern in a text grows as the text and pattern get longer.

Specifically, how many steps does the naive search take when looking for a pattern inside a larger string?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


int naiveSearch(char *text, char *pattern) {
    int n = strlen(text);
    int m = strlen(pattern);
    for (int i = 0; i <= n - m; i++) {
        int j;
        for (j = 0; j < m; j++) {
            if (text[i + j] != pattern[j])
                break;
        }
        if (j == m)
            return i; // pattern found at index i
    }
    return -1; // pattern not found
}
    

This code tries to find the first place where the pattern appears in the text by checking each possible position one by one.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The nested loops comparing characters of the pattern with the text.
  • How many times: The outer loop runs about (n - m + 1) times, and for each, the inner loop runs up to m times.
How Execution Grows With Input

As the text and pattern get longer, the number of comparisons grows roughly by multiplying their lengths.

Input Size (n)Approx. Operations
10 (text), 3 (pattern)About 8 * 3 = 24 comparisons
100 (text), 10 (pattern)About 91 * 10 = 910 comparisons
1000 (text), 50 (pattern)About 951 * 50 = 47,550 comparisons

Pattern observation: Doubling the text or pattern length roughly doubles or multiplies the work, showing a growth close to the product of their sizes.

Final Time Complexity

Time Complexity: O(n * m)

This means the time to find the pattern grows roughly by multiplying the length of the text and the pattern.

Common Mistake

[X] Wrong: "The search always takes time proportional to the text length only."

[OK] Correct: The pattern length matters too because for each position in the text, we may compare many characters of the pattern before deciding if it matches or not.

Interview Connect

Understanding this simple search helps build a foundation for more efficient algorithms and shows you can analyze how nested loops affect performance.

Self-Check

"What if we changed the pattern to be very short, like a single character? How would the time complexity change?"

Practice

(1/5)
1. What is the main idea behind the naive string pattern matching algorithm?
easy
A. Check every possible position in the text to find the pattern
B. Use a hash function to find the pattern quickly
C. Preprocess the pattern to skip some comparisons
D. Sort the text and pattern before matching

Solution

  1. Step 1: Understand naive matching approach

    The naive algorithm tries to match the pattern starting at each position in the text one by one.
  2. Step 2: Compare with other methods

    Other methods like hashing or preprocessing are not part of the naive approach.
  3. Final Answer:

    Check every possible position in the text to find the pattern -> Option A
  4. Quick Check:

    Naive = Check all positions [OK]
Hint: Naive means try all positions one by one [OK]
Common Mistakes:
  • Confusing naive with hashing or preprocessing
  • Thinking naive skips some positions
  • Assuming sorting is involved
2. Which of the following is the correct syntax to start a loop for naive pattern matching in C to check each position in the text of length n for a pattern of length m?
easy
A. for (int i = 0; i < n; i++)
B. for (int i = 0; i <= n - m; i++)
C. for (int i = 0; i < m; i++)
D. for (int i = 0; i <= n; i++)

Solution

  1. Step 1: Determine loop range for pattern matching

    We must check positions where the pattern fits fully, so i goes from 0 to n - m inclusive.
  2. Step 2: Check options

    for (int i = 0; i <= n - m; i++) correctly uses i <= n - m. Others either go beyond or do not cover all valid positions.
  3. Final Answer:

    for (int i = 0; i <= n - m; i++) -> Option B
  4. Quick Check:

    Loop till n - m inclusive [OK]
Hint: Loop till n - m to fit pattern fully [OK]
Common Mistakes:
  • Looping till n instead of n - m
  • Using < instead of <= causing missed checks
  • Looping only till m
3. What will be the output of the following C code snippet?
char text[] = "abcabcabc";
char pattern[] = "abc";
int n = 9, m = 3;
int count = 0;
for (int i = 0; i <= n - m; i++) {
    int j;
    for (j = 0; j < m; j++) {
        if (text[i + j] != pattern[j])
            break;
    }
    if (j == m) count++;
}
printf("%d\n", count);
medium
A. 1
B. 2
C. 0
D. 3

Solution

  1. Step 1: Identify pattern matches in text

    Pattern "abc" appears at positions 0, 3, and 6 in the text "abcabcabc".
  2. Step 2: Count matches

    Each match increments count, so total count is 3.
  3. Final Answer:

    3 -> Option D
  4. Quick Check:

    Pattern found 3 times [OK]
Hint: Count all exact matches by checking each position [OK]
Common Mistakes:
  • Counting overlapping matches incorrectly
  • Stopping after first match
  • Off-by-one errors in loop
4. Identify the bug in the following naive pattern matching code snippet and choose the correct fix.
char text[] = "hellohello";
char pattern[] = "hello";
int n = 10, m = 5;
int count = 0;
for (int i = 0; i < n - m; i++) {
    int j;
    for (j = 0; j < m; j++) {
        if (text[i + j] != pattern[j])
            break;
    }
    if (j == m) count++;
}
printf("%d\n", count);
medium
A. Change loop condition to i <= n - m
B. Change inner loop to j <= m
C. Initialize count to 1
D. Use strcpy instead of comparison

Solution

  1. Step 1: Analyze outer loop range

    The loop runs from i = 0 to i < n - m, which misses the last valid position at i = n - m.
  2. Step 2: Fix loop condition

    Changing to i <= n - m ensures all valid positions are checked.
  3. Final Answer:

    Change loop condition to i <= n - m -> Option A
  4. Quick Check:

    Loop must include last valid index [OK]
Hint: Use <= n - m to include last valid start [OK]
Common Mistakes:
  • Using < instead of <= in outer loop
  • Changing inner loop incorrectly
  • Misusing string functions for comparison
5. Given a text "abababab" and a pattern "aba", how many times will the naive pattern matching algorithm count the pattern occurrences including overlapping matches?
hard
A. 2
B. 5
C. 3
D. 4

Solution

  1. Step 1: Identify all starting positions for pattern

    Text length n=8, pattern length m=3, so i from 0 to 5 inclusive.
  2. Step 2: Check matches including overlaps

    Matches at positions 0 ("aba"), 2 ("aba"), and 4 ("aba") total 3 matches.
  3. Final Answer:

    3 -> Option C
  4. Quick Check:

    Count overlapping matches carefully [OK]
Hint: Check every position, count overlaps too [OK]
Common Mistakes:
  • Ignoring overlapping matches
  • Counting only non-overlapping occurrences
  • Off-by-one errors in loop range
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