मान लीजिए हमारे पास दो स्ट्रिंग्स A और B हैं। A और B की लंबाई समान है। एक शिफ्ट में हम स्ट्रिंग B को एक तत्व घुमा सकते हैं। हमें न्यूनतम आवश्यक शिफ्ट खोजनी है ताकि A और B से अधिकतम लंबाई का सामान्य उपसर्ग मिल सके। तो यदि A = "computerprogramming", और B = "programminglanguage" तो न्यूनतम शिफ्ट 8 है, और उपसर्ग "programming" है।
मान लीजिए हम स्ट्रिंग B को B के अंत में जोड़ देते हैं, तो B = B + B, फिर प्रत्येक शिफ्ट के लिए उपसर्ग को अलग से खोजने की आवश्यकता नहीं है। तो हमें B में मौजूद A का सबसे लंबा उपसर्ग खोजना है, और B में उपसर्ग की प्रारंभिक स्थिति, वास्तविक आवश्यक शिफ्ट की संख्या देगी।
उदाहरण
#include <iostream>
using namespace std;
void KhuthMorrisPatt(int m, int n, string B, string A) {
int pos = 0, len = 0;
int p[m + 1];
int k = 0;
p[1] = 0;
for (int i = 2; i <= n; i++) {
while (k > 0 && A[k] != A[i - 1])
k = p[k];
if (A[k] == A[i - 1])
++k;
p[i] = k;
}
for (int j = 0, i = 0; i < m; i++) {
while (j > 0 && A[j] != B[i])
j = p[j];
if (A[j] == B[i])
j++;
if (j > len) {
len = j;
pos = i - j + 1;
}
}
cout << "Shift = " << pos << endl;
cout << "Prefix = " << A.substr(0, len);
}
int main() {
string A = "programminglanguage";
string B = "computerprogramming";
int n = A.size();
B = B + B;
KhuthMorrisPatt(2 * n, n, B, A);
}
आउटपुट
Shift = 8 Prefix = programming