diff --git a/k/KMP.cpp b/k/KMP.cpp new file mode 100644 index 0000000..e9b7322 --- /dev/null +++ b/k/KMP.cpp @@ -0,0 +1,71 @@ +/* + * C++ Program to Implement Knuth–Morris–Pratt Algorithm (KMP) + */ +#include +#include +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,pat; + //tar ->target and pat->pattern strings + cin>>tar>>pat; + + if (KMP(pat, tar)) + cout<<"'"<