Bird
Raised Fist0
DSA Goprogramming~30 mins

KMP Pattern Matching Algorithm in DSA Go - Build from Scratch

Choose your learning style10 modes available
KMP Pattern Matching Algorithm
📖 Scenario: Imagine you are building a simple text search tool that quickly finds if a small word (pattern) appears inside a larger text. This is like searching for a friend's name in a long list of names.
🎯 Goal: You will build the KMP (Knuth-Morris-Pratt) pattern matching algorithm step-by-step in Go. This algorithm helps find the pattern efficiently by avoiding repeated checks.
📋 What You'll Learn
Create a function to build the longest prefix suffix (LPS) array for the pattern
Create a function to use the LPS array to search the pattern in the text
Use clear variable names: pattern, text, lps, i, j
Print the starting index of the pattern in the text if found, or -1 if not found
💡 Why This Matters
🌍 Real World
Text search is used in search engines, word processors, and DNA sequence analysis to quickly find patterns inside large data.
💼 Career
Understanding KMP helps in roles involving algorithms, software development, and data processing where efficient string matching is important.
Progress0 / 4 steps
1
Create the pattern and text variables
Create two string variables called pattern with value "ABABCABAB" and text with value "ABABDABACDABABCABAB".
DSA Go
Hint

Use := to create and assign the strings pattern and text.

2
Build the LPS array for the pattern
Create a function called computeLPSArray that takes a string pattern and returns an int slice called lps. Initialize lps with zeros and use variables length and i to fill it according to the KMP prefix logic.
DSA Go
Hint

Follow the KMP algorithm to fill the lps array. Use a for loop starting from i = 1 and compare characters at i and length.

3
Implement the KMP search function
Create a function called KMPsearch that takes text and pattern strings and returns the starting index of the first match or -1 if not found. Use variables i and j to track positions in text and pattern. Use the computeLPSArray function to get the lps array and apply the KMP matching logic.
DSA Go
Hint

Use two pointers i and j to scan text and pattern. Use the lps array to skip characters when mismatch happens.

4
Print the index of the pattern in the text
Call the KMPsearch function with text and pattern and print the returned index.
DSA Go
Hint

Call KMPsearch(text, pattern) and print the result using fmt.Println.

Practice

(1/5)
1. What is the main purpose of the KMP (Knuth-Morris-Pratt) algorithm in pattern matching?
easy
A. To efficiently find occurrences of a pattern in a text without rechecking characters
B. To sort the characters of the pattern alphabetically
C. To reverse the text before searching
D. To count the number of vowels in the text

Solution

  1. Step 1: Understand KMP's goal

    KMP is designed to find pattern matches in text efficiently by avoiding repeated comparisons.
  2. Step 2: Compare options with KMP's function

    Only To efficiently find occurrences of a pattern in a text without rechecking characters describes this efficient search without rechecking characters.
  3. Final Answer:

    To efficiently find occurrences of a pattern in a text without rechecking characters -> Option A
  4. Quick Check:

    KMP purpose = efficient pattern search [OK]
Hint: KMP avoids rechecking characters during pattern search [OK]
Common Mistakes:
  • Thinking KMP sorts or modifies the text
  • Confusing KMP with simple substring search
  • Assuming KMP counts characters instead of searching
2. Which of the following is the correct way to declare the prefix table (lps array) in Go for KMP algorithm?
easy
A. lps := []string{len(pattern)}
B. lps := make([]int, len(pattern))
C. lps := make([]bool, len(pattern))
D. lps := new(int)

Solution

  1. Step 1: Identify correct Go syntax for integer slice

    In Go, make([]int, size) creates an integer slice of given size.
  2. Step 2: Check options for correct slice creation

    lps := make([]int, len(pattern)) correctly creates an int slice for lps. Others use wrong types or syntax.
  3. Final Answer:

    lps := make([]int, len(pattern)) -> Option B
  4. Quick Check:

    Go slice for lps = make([]int, len(pattern)) [OK]
Hint: Use make([]int, size) to create integer slices in Go [OK]
Common Mistakes:
  • Using wrong slice type like []string or []bool
  • Using new(int) which creates a pointer, not slice
  • Incorrect slice initialization syntax
3. What will be the output of the following Go code snippet that uses KMP to find pattern occurrences?
package main
import "fmt"

func computeLPS(pattern string) []int {
    lps := make([]int, len(pattern))
    length := 0
    i := 1
    for i < len(pattern) {
        if pattern[i] == pattern[length] {
            length++
            lps[i] = length
            i++
        } else {
            if length != 0 {
                length = lps[length-1]
            } else {
                lps[i] = 0
                i++
            }
        }
    }
    return lps
}

func main() {
    pattern := "ABABC"
    lps := computeLPS(pattern)
    fmt.Println(lps)
}
medium
A. [0 0 0 0 0]
B. [0 1 2 3 4]
C. [1 2 3 4 5]
D. [0 0 1 2 0]

Solution

  1. Step 1: Compute LPS array for pattern "ABABC"

    Check characters stepwise: - i=1: 'B' != 'A' => lps[1]=0 - i=2: 'A' == 'A' => length=1, lps[2]=1 - i=3: 'B' == 'B' => length=2, lps[3]=2 - i=4: 'C' != 'A' => length=lps[1]=0, lps[4]=0
  2. Step 2: Final LPS array is [0, 0, 1, 2, 0]

    This matches [0 0 1 2 0] exactly.
  3. Final Answer:

    [0 0 1 2 0] -> Option D
  4. Quick Check:

    LPS for "ABABC" = [0 0 1 2 0] [OK]
Hint: Trace pattern chars to build LPS stepwise [OK]
Common Mistakes:
  • Confusing LPS values with pattern indices
  • Not resetting length correctly on mismatch
  • Assuming all zeros or increasing sequence
4. Identify the bug in this KMP prefix table computation code snippet in Go:
func computeLPS(pattern string) []int {
    lps := make([]int, len(pattern))
    length := 0
    i := 0
    for i < len(pattern) {
        if pattern[i] == pattern[length] {
            length++
            lps[i] = length
            i++
        } else {
            if length != 0 {
                length = lps[length-1]
            } else {
                lps[i] = 0
                i++
            }
        }
    }
    return lps
}
medium
A. The function should return a string, not []int
B. The length variable should be initialized to 1
C. The loop should start with i = 1, not 0
D. The lps array should be of type []bool

Solution

  1. Step 1: Check loop initialization for LPS computation

    In KMP, i starts from 1 because lps[0] is always 0 and no comparison needed at index 0.
  2. Step 2: Identify incorrect i initialization

    Here i starts at 0, causing incorrect comparisons and possible infinite loop.
  3. Final Answer:

    The loop should start with i = 1, not 0 -> Option C
  4. Quick Check:

    Start i=1 for LPS loop [OK]
Hint: LPS loop always starts at index 1 [OK]
Common Mistakes:
  • Starting loop at 0 causing wrong LPS values
  • Initializing length incorrectly
  • Wrong return type or array type
5. Given the text "ABABDABACDABABCABAB" and pattern "ABABCABAB", how many times does the pattern occur in the text using KMP algorithm?
hard
A. 2
B. 1
C. 3
D. 0

Solution

  1. Step 1: Understand the pattern and text

    The pattern "ABABCABAB" appears in the text at indices 10 and 12 (0-based indexing), overlapping occurrences.
  2. Step 2: Count occurrences using KMP logic

    KMP finds two matches without rechecking characters, so total occurrences = 2.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Pattern occurs twice in text [OK]
Hint: Use KMP to find all pattern matches efficiently [OK]
Common Mistakes:
  • Counting overlapping matches incorrectly
  • Overcounting occurrences
  • Assuming zero matches due to complexity
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