ধরুন আমাদের একটি প্যাটার্ন এবং একটি স্ট্রিং str আছে, str একই প্যাটার্ন অনুসরণ করে কিনা তা খুঁজে বের করুন। এখানে অনুসরণ মানে প্যাটার্নে একটি অক্ষর এবং স্ট্র-এ একটি অ-খালি শব্দের মধ্যে একটি দ্বিখণ্ডন রয়েছে।
সুতরাং, যদি ইনপুট প্যাটার্ন ="cbbc", str ="শব্দ প্যাটার্ন প্যাটার্ন শব্দ" এর মত হয়, তাহলে আউটপুট হবে True।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
strcin :=str
-
শব্দের একটি বিন্যাস সংজ্ঞায়িত করুন
-
strcin
-এর প্রতিটি শব্দের জন্য-
শব্দের শেষে শব্দ ঢোকান
-
-
একটি মানচিত্র p2i
সংজ্ঞায়িত করুন -
i :=0
-
pat :=খালি স্ট্রিং
-
প্যাটার্নে c-
এর জন্য-
যদি c p2i এর সদস্য না হয়, তাহলে −
-
(i 1 দ্বারা বাড়ান)
-
p2i[c] :=i
-
-
pat :=pat concatenate p2i[c]
-
-
একটি মানচিত্র str2i
সংজ্ঞায়িত করুন -
i :=0
-
pat1 :=ফাঁকা স্ট্রিং
-
শব্দে c এর জন্য -
-
যদি c str2i এর সদস্য না হয়, তাহলে −
-
(i 1 দ্বারা বাড়ান)
-
str2i[c] :=i
-
-
pat1 :=pat1 concatenate str2i[c]
-
-
প্রত্যাবর্তন true যখন pat1 pat এর মত হয়
উদাহরণ
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool wordPattern( string pattern, string str ) { istringstream strcin(str); string word; vector<string> words; while (strcin >> word) words.push_back(word); unordered_map<char, int> p2i; int i = 0; string pat = ""; for (auto c : pattern) { if (p2i.count(c) == 0) { i++; p2i[c] = i; } pat += to_string(p2i[c]); } unordered_map<string, int> str2i; i = 0; string pat1 = ""; for (auto c : words) { if (str2i.count(c) == 0) { i++; str2i[c] = i; } pat1 += to_string(str2i[c]); } return pat1 == pat; } }; main(){ Solution ob; cout << (ob.wordPattern("cbbc", "word pattern pattern word")); }
ইনপুট
"cbbc", "word pattern pattern word"
আউটপুট
1