Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- using namespace std;
- void preKMP(string pattern, int f[])
- {
- int m = pattern.length(), k;
- f[0] = -1;
- for (int i = 1; i < m; i++)
- {
- k = f[i - 1];
- while (k >= 0)
- {
- if (pattern[k] == pattern[i - 1])
- break;
- else
- k = f[k];
- }
- f[i] = k + 1;
- }
- }
- //check whether target string contains pattern
- bool KMP(string pattern, string target)
- {
- int m = pattern.length();
- int n = target.length();
- int f[m];
- preKMP(pattern, f);
- int i = 0;
- int k = 0;
- while (i < n)
- {
- if (k == -1)
- {
- i++;
- k = 0;
- }
- else if (target[i] == pattern[k])
- {
- i++;
- k++;
- if (k == m)
- return 1;
- }
- else
- k = f[k];
- }
- return 0;
- }
- int main()
- {
- string tar = "san and linux training";
- string pat = "lin";
- if (KMP(pat, tar))
- cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
- else
- cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
- pat = "sanfoundry";
- if (KMP(pat, tar))
- cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
- else
- cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment