You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.7 KiB
C++
62 lines
1.7 KiB
C++
/*
|
|
* C++ Program to Implement Z-Algorithm
|
|
*/
|
|
#include <iostream>
|
|
#include <cstring>
|
|
#include <vector>
|
|
using namespace std;
|
|
bool zAlgorithm(string pattern, string target)
|
|
{
|
|
string s = pattern + '$' + target;
|
|
int n = s.length();
|
|
vector<int> z(n, 0);
|
|
int goal = pattern.length();
|
|
int r = 0, l = 0, i;
|
|
for (int k = 1; k < n; k++)
|
|
{
|
|
if (k > r)
|
|
{
|
|
for (i = k; i < n && s[i] == s[i - k]; i++);
|
|
if (i > k)
|
|
{
|
|
z[k] = i - k;
|
|
l = k;
|
|
r = i - 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int kt = k - l, b = r - k + 1;
|
|
if (z[kt] > b)
|
|
{
|
|
for (i = r + 1; i < n && s[i] == s[i - k]; i++);
|
|
z[k] = i - k;
|
|
l = k;
|
|
r = i - 1;
|
|
}
|
|
}
|
|
if (z[k] == goal)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
string tar = "san and linux training";
|
|
string pat = "lin";
|
|
if (zAlgorithm(pat, tar))
|
|
cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
|
|
else
|
|
cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
|
|
pat = "sanfoundry";
|
|
if (zAlgorithm(pat, tar))
|
|
cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
|
|
else
|
|
cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
'lin' found in string 'san and linux training'
|
|
'sanfoundry' not found in string 'san and linux training'
|