ধরুন আমাদের একটি প্যাটার্ন এবং একটি স্ট্রিং 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