मान लीजिए कि हमें एक डेटा संरचना तैयार करनी है जो निम्नलिखित दो कार्यों का समर्थन करती है -
-
ऐडवर्ड (शब्द)
-
खोज (शब्द)
खोज (शब्द) विधि एक शाब्दिक शब्द या एक नियमित अभिव्यक्ति स्ट्रिंग खोज सकती है जिसमें केवल अक्षर a-z या .. A हो। इसका मतलब है कि यह किसी एक अक्षर का प्रतिनिधित्व कर सकता है। तो उदाहरण के लिए, यदि हम "बुरा", "पिताजी", "पागल" जैसे कुछ शब्द जोड़ते हैं, तो खोज ("पैड") → झूठा, खोज ("खराब") → सत्य, खोज (".ad") खोजें। → सत्य और खोज ("बी ..") → सत्य
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
कुछ विधियाँ हैं, शुरू में इन्सर्टनोड () को परिभाषित करें, यह हेड रेफरेंस और स्ट्रिंग s लेगा, यह निम्नानुसार काम करेगा -
-
वक्र:=सिर, n:=s का आकार
-
मेरे लिए 0 से n - 1 की सीमा में
-
एक्स:=एस [i]
-
अगर बच्चे [x] का curr शून्य नहीं है, तो बच्चे [x] का curr :=new node
-
curr :=बच्चे [x] करी के
-
-
isEnd of curr को सच के रूप में सेट करें
-
AddWord() से, इस insertNode() विधि को कॉल करें
-
चेक () नामक एक अन्य विधि को परिभाषित करें, यह curr, string s और index लेगा। प्रारंभ में सूचकांक 0 है। यह निम्नानुसार काम करेगा -
-
यदि अनुक्रमणिका =s का आकार, तो वापसी isEnd of curr
-
ठीक सेट करें:=सच
-
अगर s[index] डॉट है, तो
-
मेरे लिए 0 से 25 की सीमा में
-
x :='a' + i
. का ASCII -
अगर बच्चे [x] का कर्व और चेक (बच्चा [x] का curr, s, index + 1) सही है, तो सही लौटें।
-
-
-
अन्यथा
-
एक्स:=एस [सूचकांक]
-
अगर बच्चे [x] का कर्व और चेक (बच्चा [x] का curr, s, index + 1) सही है, तो सही लौटें।
-
-
झूठी वापसी
-
खोज विधि से, curr :=head और return check(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