Bird
Raised Fist0
DSA C#programming~5 mins

KMP Pattern Matching Algorithm in DSA C# - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does KMP stand for in the KMP Pattern Matching Algorithm?
KMP stands for Knuth-Morris-Pratt, the last names of the three computer scientists who developed this efficient pattern matching algorithm.
Click to reveal answer
beginner
What is the main advantage of the KMP algorithm over the naive pattern matching approach?
KMP avoids rechecking characters that have already been matched by using a precomputed 'Longest Prefix Suffix' (LPS) array, making it faster especially for large texts and patterns.
Click to reveal answer
intermediate
What is the purpose of the LPS (Longest Prefix Suffix) array in KMP?
The LPS array stores the length of the longest proper prefix of the pattern that is also a suffix for each prefix of the pattern. It helps decide where to continue matching after a mismatch.
Click to reveal answer
intermediate
In KMP, what happens when a mismatch occurs after some characters have matched?
Instead of restarting from the next character in the text, KMP uses the LPS array to shift the pattern to the right position, skipping unnecessary comparisons.
Click to reveal answer
intermediate
What is the time complexity of the KMP Pattern Matching Algorithm?
The time complexity is O(n + m), where n is the length of the text and m is the length of the pattern, because each character is processed at most twice.
Click to reveal answer
What does the LPS array in KMP represent?
ALongest prefix which is also suffix for pattern prefixes
BLongest substring in the text matching the pattern
CPositions of mismatches in the text
DNumber of pattern occurrences in the text
What is the main benefit of using KMP over naive pattern matching?
AIt uses less memory
BIt finds all substrings in constant time
CIt works only on numeric data
DIt avoids rechecking matched characters after mismatch
If the pattern is 'ABABC' and the LPS array is [0,0,1,2,0], what does the value 2 at index 3 mean?
AMismatch occurs at index 2
BPattern length is 2
CLongest prefix-suffix length for 'ABAB' is 2
DPattern repeats twice
What is the worst-case time complexity of KMP algorithm?
AO(n^2)
BO(n + m)
CO(n*m)
DO(m^2)
When a mismatch occurs in KMP, what does the algorithm do next?
AShifts pattern using LPS array to avoid rechecking
BStops searching
CRestarts matching from the next character in text
DDeletes matched characters
Explain how the LPS array is constructed in the KMP algorithm and why it is important.
Think about matching prefixes and suffixes within the pattern itself.
You got /3 concepts.
    Describe the process KMP follows when a mismatch occurs during pattern matching.
    Focus on how KMP uses precomputed information to skip unnecessary comparisons.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of the KMP (Knuth-Morris-Pratt) pattern matching algorithm?
      easy
      A. To find occurrences of a pattern string within a text efficiently
      B. To sort an array of numbers in ascending order
      C. To reverse a string in linear time
      D. To calculate the factorial of a number recursively

      Solution

      1. Step 1: Understand the goal of KMP

        KMP is designed to search for a pattern inside a larger text efficiently without rechecking characters unnecessarily.
      2. Step 2: Compare with other options

        Sorting, reversing strings, and calculating factorials are unrelated to pattern searching.
      3. Final Answer:

        To find occurrences of a pattern string within a text efficiently -> Option A
      4. Quick Check:

        KMP = Pattern searching [OK]
      Hint: KMP is all about fast pattern search in text [OK]
      Common Mistakes:
      • Confusing KMP with sorting algorithms
      • Thinking KMP reverses strings
      • Assuming KMP calculates factorials
      2. Which of the following is the correct way to declare the prefix table (lps array) in C# for KMP algorithm?
      easy
      A. int[] lps = new int();
      B. int lps = new int[pattern.Length];
      C. int lps[] = new int[pattern.Length];
      D. int[] lps = new int[pattern.Length];

      Solution

      1. Step 1: Understand array declaration in C#

        In C#, arrays are declared with type[], then new type[size]. So int[] lps = new int[pattern.Length]; is correct.
      2. Step 2: Check other options

        int lps = new int[pattern.Length]; misses [] for array type, C uses invalid syntax, D uses C/C++ style which is invalid in C#.
      3. Final Answer:

        int[] lps = new int[pattern.Length]; -> Option D
      4. Quick Check:

        C# array syntax = int[] name = new int[size]; [OK]
      Hint: Use int[] for arrays, not int alone [OK]
      Common Mistakes:
      • Missing [] in array type declaration
      • Using C/C++ style array declaration in C#
      • Trying to instantiate array without size
      3. What will be the output of the following C# code snippet using KMP algorithm to find pattern "ABABC" in text "ABABABC"?
      string text = "ABABABC";
      string pattern = "ABABC";
      List<int> matches = KMPSearch(pattern, text);
      Console.WriteLine(string.Join(",", matches));
      
      // Assume KMPSearch returns list of start indices where pattern matches text
      medium
      A. 0,2
      B. 1
      C. 2
      D. No matches

      Solution

      1. Step 1: Analyze the text and pattern

        Text: A B A B A B C Pattern: A B A B C Check where pattern fully matches text starting index.
      2. Step 2: Find matching index

        At index 0: text substring "ABABA" does not match "ABABC" (last char mismatch) At index 1: substring "BABAB" no match At index 2: substring "ABABC" matches pattern exactly.
      3. Final Answer:

        2 -> Option C
      4. Quick Check:

        Pattern found at index 2 only [OK]
      Hint: Check substring matches carefully for exact pattern [OK]
      Common Mistakes:
      • Assuming multiple matches without checking full pattern
      • Off-by-one errors in indexing
      • Confusing partial matches as full matches
      4. Identify the bug in this KMP prefix table (lps) computation code snippet in C#:
      int[] ComputeLPS(string pattern) {
          int[] lps = new int[pattern.Length];
          int length = 0;
          int i = 1;
          while (i < pattern.Length) {
              if (pattern[i] == pattern[length]) {
                  length++;
                  lps[i] = length;
                  i++;
              } else {
                  if (length != 0) {
                      length = lps[length];
                  } else {
                      lps[i] = 0;
                      i++;
                  }
              }
          }
          return lps;
      }
      medium
      A. Incorrect update of length in else block: should be length = lps[length - 1];
      B. Wrong initialization of lps array size
      C. Using while loop instead of for loop causes infinite loop
      D. Missing return statement at the end

      Solution

      1. Step 1: Understand lps update logic

        When mismatch occurs and length != 0, length should be updated to lps[length - 1], not lps[length].
      2. Step 2: Check other parts

        Array size is correct, while loop is valid, return statement exists. So only length update is wrong.
      3. Final Answer:

        Incorrect update of length in else block: should be length = lps[length - 1]; -> Option A
      4. Quick Check:

        lps update uses length-1 index [OK]
      Hint: Use length-1 index when updating length on mismatch [OK]
      Common Mistakes:
      • Using lps[length] instead of lps[length - 1]
      • Confusing loop types causing infinite loops
      • Forgetting to return lps array
      5. Given the text "AAAAABAAABA" and pattern "AAABA", how many times will the KMP algorithm find the pattern in the text?
      hard
      A. 3
      B. 2
      C. 4
      D. 1

      Solution

      1. Step 1: Identify all occurrences of pattern in text

        Text: A A A A A B A A A B A Pattern: A A A B A Check each possible start index:
      2. Step 2: Check matches at each index

        Index 0: substring "AAAAA" no (pattern ends with B) Index 1: substring "AAAAB" no (pattern ends with A) Index 2: substring "AAABA" yes (match 1) Index 3: substring "AABAA" no Index 4: substring "ABAAA" no Index 5: substring "BAAAB" no Index 6: substring "AAABA" yes (match 2) Index 7: substring "AABA" incomplete Index 8: substring "ABA" incomplete Check carefully for overlapping matches.
      3. Step 3: Re-check for missed matches

        Check index 1 carefully: substring "AAAAB" pattern is "AAABA" so no match. Check index 0 carefully: substring "AAAAA" pattern ends with B, no match. Check index 6: "AAABA" matches pattern exactly (match 2). Check index 2: "AAABA" matches pattern exactly (match 1). No other matches found.
      4. Step 4: Check index 3 for overlapping match

        At index 3: substring "AABAA" does not match pattern "AAABA". At index 4: substring "ABAAA" no match. At index 5: substring "BAAAB" no match. At index 7: substring "AABA" incomplete. So total matches found: 2.
      5. Final Answer:

        2 -> Option B
      6. Quick Check:

        Pattern found twice in text [OK]
      Hint: Check each substring carefully for full pattern match [OK]
      Common Mistakes:
      • Counting partial matches as full matches
      • Missing overlapping matches
      • Off-by-one errors in substring indexing
      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