ধরুন আমাদের একটি ডেটা স্ট্রাকচার ডিজাইন করতে হবে যা নিম্নলিখিত দুটি ক্রিয়াকলাপকে সমর্থন করে −
-
addWord(শব্দ)
-
অনুসন্ধান(শব্দ)
অনুসন্ধান(শব্দ) পদ্ধতিটি একটি আক্ষরিক শব্দ বা একটি রেগুলার এক্সপ্রেশন স্ট্রিং অনুসন্ধান করতে পারে যেখানে শুধুমাত্র a-z বা .. A অক্ষর রয়েছে। মানে এটি যেকোনো একটি অক্ষর প্রতিনিধিত্ব করতে পারে। সুতরাং উদাহরণস্বরূপ, যদি আমরা "খারাপ", "বাবা", "পাগল" এর মতো কিছু শব্দ যোগ করি, তাহলে অনুসন্ধান ("প্যাড") → মিথ্যা, অনুসন্ধান ("খারাপ") → সত্য, অনুসন্ধান (". বিজ্ঞাপন") অনুসন্ধান করুন। → সত্য এবং অনুসন্ধান (“বি..”) → সত্য
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
কিছু পদ্ধতি আছে, প্রাথমিকভাবে insertNode() সংজ্ঞায়িত করুন, এটি হেড রেফারেন্স এবং স্ট্রিং s নেবে, এটি নিম্নরূপ কাজ করবে -
-
curr :=head, n :=s
এর আকার -
0 থেকে n – 1
রেঞ্জের i জন্য-
x :=s[i]
-
যদি curr এর চাইল্ড[x] শূন্য না হয়, তাহলে curr এর চাইল্ড[x] :=নতুন নোড
-
curr :=curr এর সন্তান [x]
-
-
curr এর শেষকে সত্য হিসাবে সেট করুন
-
addWord() থেকে, এই insertNode() পদ্ধতিতে কল করুন
-
চেক() নামে আরেকটি পদ্ধতি সংজ্ঞায়িত করুন, এটি curr, স্ট্রিং s এবং সূচক নেবে। প্রাথমিকভাবে সূচকটি 0। এটি নিম্নরূপ কাজ করবে -
-
যদি সূচী =s এর আকার, তাহলে curr এর শেষ হয়
-
ঠিক আছে সেট করুন :=সত্য
-
যদি s[সূচী] বিন্দু হয়, তাহলে
-
আমি 0 থেকে 25 রেঞ্জের জন্য
-
x :='a' + i
এর ASCII -
যদি curr-এর চাইল্ড[x] এবং চেক(child[x] of curr, s, index + 1) সত্য হয়, তাহলে true ফেরত দিন।
-
-
-
অন্যথায়
-
x :=s[সূচী]
-
যদি curr-এর চাইল্ড[x] এবং চেক(child[x] of curr, s, index + 1) সত্য হয়, তাহলে true ফেরত দিন।
-
-
মিথ্যা ফেরত দিন
-
অনুসন্ধান পদ্ধতি থেকে, curr :=হেড এবং রিটার্ন চেক (curr, word, 0)
সেট করুন
উদাহরণ (C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h> using namespace std; struct Node{ bool isEnd; map <char, Node*> child; Node(){ isEnd = false; } }; class WordDictionary { public: Node* head; WordDictionary() { head = new Node(); } void insertNode(Node* head, string s){ Node* curr = head; int n = s.size(); for(int i = 0; i < n; i++){ char x = s[i]; if(!curr->child[x]){ curr->child[x] = new Node(); } curr = curr->child[x]; } curr->isEnd = true; } void addWord(string word) { insertNode(head, word); } bool check(Node* curr, string s, int idx = 0){ if(idx == s.size()) return curr->isEnd; bool ok = false; if(s[idx] == '.'){ for(int i = 0; i < 26; i++){ char x = 'a' + i; if(curr->child[x] && check(curr->child[x], s, idx + 1))return true; } } else { char x = s[idx]; if(curr->child[x] && check(curr->child[x], s, idx + 1))return true; } return false; } bool search(string word) { Node* curr = head; return check(curr, word); } }; main(){ WordDictionary ob; ob.addWord("bad"); ob.addWord("dad"); ob.addWord("mad"); cout << (ob.search("pad")) << endl; cout << (ob.search("bad")) << endl; cout << (ob.search(".ad")) << endl; cout << (ob.search("b..")) << endl; }
ইনপুট
Initialize the WordDictionary, then call the addWord() methods ans search methods. See in the main() function
আউটপুট
0 1 1 1