অ্যানাগ্রামগুলি মূলত একটি প্রদত্ত স্ট্রিং বা প্যাটার্নের সমস্ত পারমুটেশন। এই প্যাটার্ন অনুসন্ধান অ্যালগরিদম সামান্য ভিন্ন. এই ক্ষেত্রে, শুধুমাত্র সঠিক প্যাটার্নটিই অনুসন্ধান করা হয় না, এটি পাঠ্যে প্রদত্ত প্যাটার্নের সমস্ত সম্ভাব্য বিন্যাস অনুসন্ধান করে৷
এই সমস্যাটি সমাধান করার জন্য, আমরা পুরো পাঠকে প্যাটার্নের মতো দৈর্ঘ্যের কয়েকটি উইন্ডোতে ভাগ করব। তারপর প্যাটার্নের প্রতিটি অক্ষর গণনা করা হয় এবং একটি অ্যারেতে সংরক্ষণ করা হয়। প্রতিটি উইন্ডোর জন্য, আমরা গণনা অ্যারে খুঁজে বের করার চেষ্টা করি, তারপরে তারা মিলছে কি না তা পরীক্ষা করুন৷
অ্যানাগ্রাম প্যাটার্ন অনুসন্ধান অ্যালগরিদমের সময় জটিলতা হল O(n).
ইনপুট এবং আউটপুট
Input: The main String “AABAACBABBCABAABBA”. The pattern “AABC”. Output: Anagram found at position: 2 Anagram found at position: 3 Anagram found at position: 4 Anagram found at position: 10
অ্যালগরিদম
anagramSearch(text, pattern)
ইনপুট - প্রধান স্ট্রিং এবং প্যাটার্ন
আউটপুট - সমস্ত অবস্থান যেখানে প্যাটার্ন এবং এটির সমস্ত অ্যানাগ্রাম পাওয়া যায়৷
৷Begin define patternFreq array and stringFreq array patLne := length of pattern stringLen := length of the text set all entries of patternFreq array to 0 for all characters present in pattern, do increase the frequency. done for i := 0 to i<= stringLen – patLen, do set all entries of stringFreq to 0 for all characters of each window, do increase the frequency done if the stringFreq and patternFreq are same, then display the value of i, as anagram found at that location done End
উদাহরণ
#include<iostream> #include<cstring> #define LETTER 26 using namespace std; bool arrayCompare(int *array1, int *array2, int n) { for(int i = 0; i<n; i++) { if(array1[i] != array2[i]) return false; //if there is one mismatch stop working } return true; //arrays are identical } void setArray(int *array, int n, int value) { for(int i = 0; i<n; i++) array[i] = value; //put value for all places in the array } void anagramSearch(string mainString, string patt, int *array, int *index) { int strFreq[LETTER], pattFreq[LETTER]; int patLen = patt.size(); int stringLen = mainString.size(); setArray(pattFreq, LETTER, 0); //initialize all frequency to 0 for(int i = 0; i<patLen; i++) { int patIndex = patt[i] - 'A'; //subtract ASCII of A pattFreq[patIndex]++; //increase frequency } for(int i = 0; i<=(stringLen - patLen); i++) { //the range where window will move setArray(strFreq, LETTER, 0); //initialize all frequency to 0 for main string for(int j = i; j<(i+patLen); j++){ //update frequency for each window. int strIndex = mainString[j] - 'A'; strFreq[strIndex]++; //increase frequency } if(arrayCompare(strFreq, pattFreq, LETTER)) { //when both arrays are identical (*index)++; array[*index] = i; //anagram found at ith position } } } int main() { string mainStrng = "AABAACBABBCABAABBA"; string pattern = "AABC"; int matchLocation[mainStrng.size()]; int index = -1; anagramSearch(mainStrng, pattern, matchLocation, &index); for(int i = 0; i<=index; i++) { cout << "Anagram found at position: " << matchLocation[i] << endl; } }
আউটপুট
Anagram found at position: 2 Anagram found at position: 3 Anagram found at position: 4 Anagram found at position: 10