मान लीजिए कि एक वर्ग है जो कंस्ट्रक्टर में शब्दों की एक सूची प्राप्त करता है, एक ऐसी विधि होगी जो दो शब्द शब्द 1 और शब्द 2 लेती है और सूची में इन दो शब्दों के बीच सबसे छोटी दूरी का पता लगाती है। उस विधि को अलग-अलग पैरामीटर के साथ कई बार बार-बार बुलाया जाएगा।
आइए मान लें कि शब्द =["अभ्यास", "बनाता है", "पूर्ण", "कौशल", "बनता है"]।
इसलिए, यदि इनपुट शब्द 1 ="कौशल", शब्द 2 ="अभ्यास" जैसा है, तो आउटपुट 3
होगाइसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक नक्शा परिभाषित करें मी
-
प्रारंभकर्ता शब्दों की एक सरणी लेता है
-
इनिशियलाइज़ i :=0 के लिए, जब i <शब्दों का आकार, अपडेट (i 1 से बढ़ाएँ), करें -
-
m[words[i]]
. के अंत में i डालें
-
-
-
किसी फ़ंक्शन को सबसे छोटा () परिभाषित करें, इसमें शब्द1, शब्द2,
लगेगा -
एक सरणी परिभाषित करें arr1 :=m[word1]
-
एक सरणी परिभाषित करें arr2 :=m[word2]
-
मैं:=0, जे:=0
-
रिट:=अनंत
-
जबकि (i
-
रिट :=न्यूनतम रिट और |arr1[i] - arr2[j]|
-
अगर arr1[i]
-
(मैं 1 से बढ़ाइए)
-
-
अन्यथा
-
(जम्मू को 1 से बढ़ाएं)
-
-
-
वापसी रिट
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; class WordDistance { public: unordered_map <string, vector <int< > m; WordDistance(vector<string<& words) { for(int i = 0; i < words.size(); i++){ m[words[i]].push_back(i); } } int shortest(string word1, string word2) { vector<int<& arr1 = m[word1]; vector<int<& arr2 = m[word2]; int i = 0; int j = 0; int ret = INT_MAX; while (i < arr1.size() && j < arr2.size()) { ret = min(ret, abs(arr1[i] - arr2[j])); if (arr1[i] < arr2[j]) { i++; } else j++; } return ret; } }; main(){ vector<string< v = {"practice", "makes", "perfect", "skill","makes"}; WordDistance ob(v); cout << (ob.shortest("skill", "practice")) << endl; cout << (ob.shortest("makes", "skill")); }
इनपुट
{"practice", "makes", "perfect", "skill", "makes"} Call shortest("skill", "practice") Call shortest("makes", "skill")
आउटपुट
3 1