KMP precomputes the longest proper prefix that is also a suffix (LPS) for each pattern prefix. On mismatch, it shifts the pattern using the LPS value instead of moving the text pointer back, so characters in the text are not re-checked.
Advanced answer
Deep dive
Expanding on the short answer — what usually matters in practice:
Complexity: compare typical operations (average vs worst-case).
Invariants: what must always hold for correctness.
When the choice is wrong: production symptoms (latency, GC, cache misses).
Explain the "why", not just the "what" (intuition + consequences).
Trade-offs: what you gain/lose (time, memory, complexity, risk).
Edge cases: empty inputs, large inputs, invalid inputs, concurrency.
Examples
A tiny example (an explanation template):
// Example: discuss trade-offs for "kmp-string-search:-how-does-the-lps/prefix-table"
function explain() {
// Start from the core idea:
// KMP precomputes the longest proper prefix that is also a suffix (LPS) for each pattern pre
}
Common pitfalls
Too generic: no concrete trade-offs or examples.
Mixing average-case and worst-case (e.g., complexity).