ধরুন একটি ক্লাস আছে যেটি কন্সট্রাক্টরে শব্দের একটি তালিকা পেয়েছে, সেখানে একটি পদ্ধতি থাকবে যা শব্দ 1 এবং শব্দ 2 দুটি শব্দ নেয় এবং তালিকায় এই দুটি শব্দের মধ্যে সবচেয়ে কম দূরত্ব খুঁজে পাবে। সেই পদ্ধতিটি বিভিন্ন পরামিতি সহ বহুবার বারবার কল করা হবে।
আসুন ধরে নিই যে শব্দগুলি =["অভ্যাস", "মেকস", "পারফেক্ট", "স্কিল", "মেকস"]।
সুতরাং, যদি ইনপুট হয় word1 =“দক্ষতা”, word2 =“অভ্যাস”, তাহলে আউটপুট হবে 3
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি মানচিত্র m
সংজ্ঞায়িত করুন -
ইনিশিয়ালাইজার শব্দের একটি অ্যারে নেয়
-
আরম্ভ করার জন্য i :=0, যখন i <শব্দের আকার, আপডেট (i 1 দ্বারা বৃদ্ধি), −
-
m[words[i]]
এর শেষে i ঢোকান
-
-
-
সংক্ষিপ্ততম একটি ফাংশন সংজ্ঞায়িত করুন, এটি শব্দ1, শব্দ2,
লাগবে -
একটি অ্যারে সংজ্ঞায়িত করুন arr1 :=m[word1]
-
একটি অ্যারে সংজ্ঞায়িত করুন arr2 :=m[word2]
-
i :=0, j :=0
-
ret :=অসীম
-
যখন (i
করুন -
ret :=সর্বনিম্ন ret এবং |arr1[i] - arr2[j]|
-
যদি arr1[i]
-
(i 1 দ্বারা বাড়ান)
-
-
অন্যথায়
-
(j 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