Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ . में सबसे छोटी शब्द दूरी II

मान लीजिए कि एक वर्ग है जो कंस्ट्रक्टर में शब्दों की एक सूची प्राप्त करता है, एक ऐसी विधि होगी जो दो शब्द शब्द 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

  1. सी++ में वन एडिट डिस्टेंस

    मान लीजिए कि हमारे पास दो तार s और t हैं; हमें यह जांचना होगा कि क्या वे दोनों एक संपादन दूरी अलग हैं। एक संपादन दूरी तीन प्रकार की होती है - t प्राप्त करने के लिए s में एक वर्ण डालें t प्राप्त करने के लिए s से एक वर्ण हटाएं t पाने के लिए s का वर्ण बदलें इसलिए, यदि इनपुट s =ab, t =acb जै

  1. सी ++ में सबसे छोटा बहुमत सबस्ट्रिंग

    मान लीजिए कि हमारे पास एक लोअरकेस वर्णमाला स्ट्रिंग है, हमें सबसे छोटी सबस्ट्रिंग की लंबाई (न्यूनतम लंबाई 2 है) का पता लगाना है, जैसे कि कुछ अक्षर संयुक्त अन्य अक्षरों की तुलना में अधिक दिखाई देते हैं। अगर हमें कोई समाधान नहीं मिल रहा है, तो -1 लौटें। इसलिए, यदि इनपुट abbbcde जैसा है, तो आउटपुट 2 हो

  1. सी++ में बीके ट्री परिचय

    बीके ट्री या बर्कहार्ड ट्री एक डेटा संरचना का एक रूप है जो आमतौर पर लेवेनशेटिन दूरी के आधार पर वर्तनी जांच करने के लिए उपयोग किया जाता है। इसका उपयोग स्ट्रिंग मिलान के लिए भी किया जाता है स्वत:सुधार सुविधा का उपयोग इस डेटा संरचना को बनाने के लिए किया जा सकता है। मान लीजिए कि हमारे पास एक शब्दकोश में