मान लीजिए कि हमारे पास दो तार A और B हैं। A और B की लंबाई समान है। एक ही पाली में हम स्ट्रिंग B एक तत्व को घुमा सकते हैं। हमें ए और बी से अधिकतम लंबाई का सामान्य उपसर्ग प्राप्त करने के लिए न्यूनतम आवश्यक शिफ्ट खोजना होगा। इसलिए यदि ए ="कंप्यूटर प्रोग्रामिंग", और बी ="प्रोग्रामिंग भाषा" तो न्यूनतम शिफ्ट 8 है, और उपसर्ग "प्रोग्रामिंग" है।
मान लीजिए हम बी के अंत में स्ट्रिंग बी जोड़ते हैं, तो बी =बी + बी, तो प्रत्येक शिफ्ट के उपसर्ग को अलग से खोजने की आवश्यकता नहीं है। इसलिए हमें बी में मौजूद ए का सबसे लंबा उपसर्ग खोजना होगा, और बी में उपसर्ग की शुरुआती स्थिति, आवश्यक बदलावों की वास्तविक संख्या देगी।
उदाहरण
#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