From 7731ea06258dc27703924f8476dcb85d852decdc Mon Sep 17 00:00:00 2001 From: Akul Agrawal <31360523+akulagrawal@users.noreply.github.com> Date: Fri, 2 Oct 2020 13:29:15 +0530 Subject: [PATCH] Create KMP.cs --- String/KMP/KMP.cs | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 String/KMP/KMP.cs diff --git a/String/KMP/KMP.cs b/String/KMP/KMP.cs new file mode 100644 index 00000000..de7fb784 --- /dev/null +++ b/String/KMP/KMP.cs @@ -0,0 +1,88 @@ +// C# program for implementation of KMP pattern +// searching algorithm +using System; + +class GFG { + + void KMPSearch(string pat, string txt) + { + int M = pat.Length; + int N = txt.Length; + + // create lps[] that will hold the longest + // prefix suffix values for pattern + int[] lps = new int[M]; + int j = 0; // index for pat[] + + // Preprocess the pattern (calculate lps[] + // array) + computeLPSArray(pat, M, lps); + + int i = 0; // index for txt[] + while (i < N) { + if (pat[j] == txt[i]) { + j++; + i++; + } + if (j == M) { + Console.Write("Found pattern " + + "at index " + (i - j)); + j = lps[j - 1]; + } + + // mismatch after j matches + else if (i < N && pat[j] != txt[i]) { + // Do not match lps[0..lps[j-1]] characters, + // they will match anyway + if (j != 0) + j = lps[j - 1]; + else + i = i + 1; + } + } + } + + void computeLPSArray(string pat, int M, int[] lps) + { + // length of the previous longest prefix suffix + int len = 0; + int i = 1; + lps[0] = 0; // lps[0] is always 0 + + // the loop calculates lps[i] for i = 1 to M-1 + while (i < M) { + if (pat[i] == pat[len]) { + len++; + lps[i] = len; + i++; + } + else // (pat[i] != pat[len]) + { + // This is tricky. Consider the example. + // AAACAAAA and i = 7. The idea is similar + // to search step. + if (len != 0) { + len = lps[len - 1]; + + // Also, note that we do not increment + // i here + } + else // if (len == 0) + { + lps[i] = len; + i++; + } + } + } + } + + // Driver program to test above function + public static void Main() + { + string txt = "ABABDABACDABABCABAB"; + string pat = "ABABCABAB"; + new GFG().KMPSearch(pat, txt); + } +} + +// This code has been contributed by Amit Khandelwal.