Advertisement
dipBRUR

KMP

Aug 13th, 2017
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. /**
  2.  * Author        : Dipu Kumar Mohanto Dip
  3.  *                 CSE, BRUR.
  4.  *                 Batch - 6
  5.  *
  6.  * Problem       : KMP Algorithm Implementation
  7.  * Algorithm     : Knuth Morris Pratt Algorithm
  8.  * Complexity    : O(m+n)
  9.  * Category      : String, Search
  10.  *
  11.  * Difficulty    : Easy
  12.  *
  13.  * Source        : GeeksForGeeks
  14.  *
  15.  * Veridict      : OK
  16.  *
  17.  * Date          :
  18.  * E-mail        : dipukumarmohanto1@gmail.com
  19. **/
  20.  
  21. #include<bits/stdc++.h>
  22.  
  23. using namespace std;
  24.  
  25. void computeLPSArray(char *pat, int M, int *lps);
  26.  
  27. // Prints occurrences of txt[] in pat[]
  28. void KMPSearch(char *pat, char *txt)
  29. {
  30.     int M = strlen(pat);
  31.     int N = strlen(txt);
  32.  
  33.     // create lps[] that will hold the longest prefix suffix
  34.     // values for pattern
  35.     int lps[M];
  36.  
  37.     // Preprocess the pattern (calculate lps[] array)
  38.     computeLPSArray(pat, M, lps);
  39.  
  40.     int i = 0;  // index for txt[]
  41.     int j  = 0;  // index for pat[]
  42.     while (i < N)
  43.     {
  44.         if (pat[j] == txt[i])
  45.         {
  46.             j++;
  47.             i++;
  48.         }
  49.  
  50.         if (j == M)
  51.         {
  52.             printf("Found pattern at index %d n", i-j);
  53.             j = lps[j-1];
  54.         }
  55.  
  56.         // mismatch after j matches
  57.         else if (i < N && pat[j] != txt[i])
  58.         {
  59.             // Do not match lps[0..lps[j-1]] characters,
  60.             // they will match anyway
  61.             if (j != 0)
  62.                 j = lps[j-1];
  63.             else
  64.                 i = i+1;
  65.         }
  66.     }
  67. }
  68.  
  69. // Fills lps[] for given patttern pat[0..M-1]
  70. void computeLPSArray(char *pat, int M, int *lps)
  71. {
  72.     // length of the previous longest prefix suffix
  73.     int len = 0;
  74.  
  75.     lps[0] = 0; // lps[0] is always 0
  76.  
  77.     // the loop calculates lps[i] for i = 1 to M-1
  78.     int i = 1;
  79.     while (i < M)
  80.     {
  81.         if (pat[i] == pat[len])
  82.         {
  83.             len++;
  84.             lps[i] = len;
  85.             i++;
  86.         }
  87.         else // (pat[i] != pat[len])
  88.         {
  89.             // This is tricky. Consider the example.
  90.             // AAACAAAA and i = 7. The idea is similar
  91.             // to search step.
  92.             if (len != 0)
  93.             {
  94.                 len = lps[len-1];
  95.  
  96.                 // Also, note that we do not increment
  97.                 // i here
  98.             }
  99.             else // if (len == 0)
  100.             {
  101.                 lps[i] = 0;
  102.                 i++;
  103.             }
  104.         }
  105.     }
  106. }
  107.  
  108.  
  109. int main()
  110. {
  111.     char *txt = "ABABDABACDABABCABAB";
  112.     char *pat = "ABABCABAB";
  113.     KMPSearch(pat, txt);
  114.     return 0;
  115. }
  116.  
  117. /*****************************************************
  118.  
  119. >>> Output :
  120. Found pattern at index 10
  121.  
  122. ******************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement