विपर्यय मूल रूप से किसी दिए गए स्ट्रिंग या पैटर्न के सभी क्रमपरिवर्तन हैं। यह पैटर्न खोज एल्गोरिथ्म थोड़ा अलग है। इस मामले में, न केवल सटीक पैटर्न की खोज की जाती है, यह पाठ में दिए गए पैटर्न की सभी संभावित व्यवस्थाओं को खोजता है।
इस समस्या को हल करने के लिए, हम पूरे पाठ को पैटर्न के समान लंबाई की कई खिड़कियों में विभाजित करेंगे। फिर पैटर्न के प्रत्येक वर्ण पर गिनें पाया जाता है और एक सरणी में संग्रहीत किया जाता है। प्रत्येक विंडो के लिए, हम गिनती सरणी खोजने का भी प्रयास करते हैं, फिर जांचते हैं कि वे मेल खाते हैं या नहीं।
एनाग्राम पैटर्न सर्च एल्गोरिथम की समय जटिलता O(n) है।
इनपुट और आउटपुट
इनपुट:मुख्य स्ट्रिंग "आबाकबक्काबाबा"। पैटर्न "एएबीसी"। आउटपुट:स्थिति में मिला एनाग्राम:स्थिति में 2 एनाग्राम मिला:स्थिति पर 3 एनाग्राम मिला:4 एनाग्राम स्थिति में मिला:10
एल्गोरिदम
एनाग्रामसर्च(टेक्स्ट, पैटर्न)
इनपुट - मुख्य स्ट्रिंग और पैटर्न
आउटपुट - सभी स्थान जहां पैटर्न और उसके सभी विपर्यय पाए जाते हैं।
पैटर्नफ़्रेक सरणी और स्ट्रिंगफ़्रेक सरणी को परिभाषित करना शुरू करें patLne:=पैटर्न की लंबाई stringLen:=टेक्स्ट की लंबाई पैटर्न में मौजूद सभी वर्णों के लिए patternFreq सरणी की सभी प्रविष्टियों को 0 पर सेट करें, आवृत्ति में वृद्धि करें। i के लिए किया गया:=0 से i<=stringLen - patLen, प्रत्येक विंडो के सभी वर्णों के लिए stringFreq की सभी प्रविष्टियों को 0 पर सेट करें, यदि स्ट्रिंगफ़्रीक और पैटर्नफ़्रीक समान हैं, तो आवृत्ति में वृद्धि करें, फिर i का मान प्रदर्शित करें, जैसा कि विपर्यय उस स्थान पर पाया गया हो गयाअंत
उदाहरण
#शामिल करें (सरणी 1 [i]! =सरणी 2 [i]) झूठी वापसी; // अगर एक बेमेल काम करना बंद कर देता है } सच हो जाता है; // सरणियाँ समान हैं} शून्य सेटअरे (int * array, int n, int value) { for(int i =0; iआउटपुट
विपरीत स्थिति में मिला:2Anagram स्थिति में मिला:3Anagram स्थिति में मिला:4Anagram स्थिति में मिला:10