সমস্যা বিবরণ
দুটি লোয়ারকেস স্ট্রিং s এবং t দেওয়া আছে। একটি অপারেশনে s-এর যেকোনো ক্যারেক্টারের সব অকরেন্সকে অন্য ক্যারেক্টারের দিয়ে রিপ্লেস করা যায়। এই অপারেশন যেকোনো সংখ্যকবার করা যায়। চেক করতে হবে s কি t-এ রূপান্তর করা সম্ভব।
উদাহরণ: s = "eye", t = "pip" হলে আউটপুট True। কারণ 'e' -> 'p' এবং 'y' -> 'i' রিপ্লেস করলে "pip" পাওয়া যায়।
সমাধানের পদ্ধতি
- দুটি ম্যাপ
m1(s থেকে t) এবংm2(t থেকে s) ব্যবহার করুন। - প্রতিটি ক্যারেক্টার পেয়ার
(s[i], t[i])এর জন্য চেক করুন। - যদি
s[i]ইতিমধ্যে ম্যাপে থাকে তবেm1[s[i]] == t[i]কিনা চেক করুন। - যদি
t[i]ইতিমধ্যে ম্যাপে থাকে তবেm2[t[i]] == s[i]কিনা চেক করুন (বাইজেকশন নিশ্চিত করতে)। - কোনো সন্দর্ভ পেলে
falseরিটার্ন করুন। - সব চেক পাস করলে
trueরিটার্ন করুন।
উদাহরণ কোড
#include <bits/stdc++.h>
using namespace std;
bool solve(string s, string t) {
unordered_map<char, char> m1, m2;
int n = s.size();
for (int i = 0; i < n; i++) {
if (m1.count(s[i])) {
if (m1[s[i]] != t[i]) return false;
} else {
m1[s[i]] = t[i];
}
if (m2.count(t[i])) {
if (m2[t[i]] != s[i]) return false;
} else {
m2[t[i]] = s[i];
}
}
return true;
}
int main() {
string s = "eye", t = "pip";
cout << solve(s, t);
return 0;
}
ইনপুট ও আউটপুট
ইনপুট: "eye", "pip"
আউটপুট: 1