मान लीजिए हमारे पास शब्दों की एक सूची है। ये शब्द अलग हैं। हमें एक एल्गोरिथम तैयार करना होगा जो शब्दों की सूची में सभी सम्मिलित शब्दों को ढूंढेगा। एक संयोजित शब्द वास्तव में एक स्ट्रिंग है जिसमें दिए गए सरणी में कम से कम दो छोटे शब्द शामिल होते हैं।
तो अगर शब्द ["गाय", "गाय", "गाय का बकरा", "बकरी", "बकरी बकरी", "हिप्पोपोटामस", "हिरण", "डीरकोगोअटको"] जैसे हैं, तो आउटपुट ["गाय का बकरा" होगा, "बकरी का बकरा", "डीरकाउगोआटकाउ"]
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक फ़ंक्शन परिभाषित करें isPresent(), यह str, head, idx, एक सरणी dp, लेगा
- यदि idx>=str का आकार, तो −
- सही लौटें
- यदि dp[idx] -1 के बराबर नहीं है, तो −
- रिटर्न डीपी[idx]
- नोड कर्व बनाएं:=हेड
- ठीक है:=झूठा
- इनिशियलाइज़ i :=idx के लिए, जब i
- x :=str[i]
- अगर बच्चा नहीं है[x] करी है, तो −
- लूप से बाहर आएं
- अन्यथा
- curr :=बच्चे[x] करी का
- यदि isEnd of curr सत्य है, तो −
- ठीक है:=ठीक है या मौजूद है(str, head, i + 1, dp)
- बच्चा[x] curr :=एक नया नोड बनाएं
- करी :=शब्द[i]
- यदि curr "" के समान है, तो −
- निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
- कर्र के समान आकार की एक सरणी डीपी परिभाषित करें, इसे -1 से भरें
- यदि फ़ंक्शन को कॉल करें isPresent(curr, head, 0, dp) गैर-शून्य है, तो −
- रिट के अंत में curr डालें
- अन्यथा
- फ़ंक्शन को कॉल करें insertNode(head, curr)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } struct Node{ bool isEnd; map <char, Node*> child; Node(){ isEnd = false; } }; class Solution { public: bool isPresent(string str, Node* head, int idx, vector <int>& dp){ if(idx >= str.size())return true; if(dp[idx] != -1)return dp[idx]; Node* curr = head; bool ok = false; for(int i = idx; i < str.size(); i++){ char x = str[i]; if(!curr->child[x]){ break; }else{ curr = curr->child[x]; } if(curr->isEnd){ ok |= isPresent(str, head, i + 1, dp); } } return dp[idx] = ok; } static bool cmp(string s1, string s2){ return s1.size() < s2.size(); } void insertNode(Node* head, string s){ Node* curr = head; for(int i = 0; i < s.size(); i++){ char x = s[i]; if(!curr->child[x]){ curr->child[x] = new Node(); } curr = curr->child[x]; } curr->isEnd = true; } vector<string> findAllConcatenatedWordsInADict(vector<string>& words) { Node* head = new Node(); sort(words.begin(), words.end(), cmp); vector <string> ret; for(int i = 0; i < words.size(); i++){ string curr = words[i]; if(curr=="")continue; vector <int> dp(curr.size(), -1); if(isPresent(curr, head, 0, dp)){ ret.push_back(curr); }else{ insertNode(head, curr); } } return ret; } }; main(){ Solution ob; vector<string> v = {"cow","cows","cowsgoatcows","goat","goatcowsgoat","hippopotamuses","deer","deercowgoatcow"}; print_vector(ob.findAllConcatenatedWordsInADict(v)); }
इनपुट
{"cow","cows","cowsgoatcows","goat","goatcowsgoat","hippopotamuses","deer","deercowgoatcow"}
आउटपुट
[cowsgoatcows, goatcowsgoat, deercowgoatcow, ]