keymasterviriya1150

Knuth–Morris–Pratt Algorithm

Apr 19th, 2016
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. void preKMP(string pattern, int f[])
  5. {
  6.     int m = pattern.length(), k;
  7.     f[0] = -1;
  8.     for (int i = 1; i < m; i++)
  9.     {
  10.         k = f[i - 1];
  11.         while (k >= 0)
  12.         {
  13.             if (pattern[k] == pattern[i - 1])
  14.                 break;
  15.             else
  16.                 k = f[k];
  17.         }
  18.         f[i] = k + 1;
  19.     }
  20. }
  21.  
  22. //check whether target string contains pattern
  23. bool KMP(string pattern, string target)
  24. {
  25.     int m = pattern.length();
  26.     int n = target.length();
  27.     int f[m];    
  28.     preKMP(pattern, f);    
  29.     int i = 0;
  30.     int k = 0;        
  31.     while (i < n)
  32.     {
  33.         if (k == -1)
  34.         {
  35.             i++;
  36.             k = 0;
  37.         }
  38.         else if (target[i] == pattern[k])
  39.         {
  40.             i++;
  41.             k++;
  42.             if (k == m)
  43.                 return 1;
  44.         }
  45.         else
  46.             k = f[k];
  47.     }
  48.     return 0;
  49. }
  50.  
  51. int main()
  52. {
  53.     string tar = "san and linux training";
  54.     string pat = "lin";
  55.     if (KMP(pat, tar))
  56.         cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
  57.     else
  58.         cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
  59.     pat = "sanfoundry";
  60.     if (KMP(pat, tar))
  61.         cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
  62.     else
  63.         cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment