ধরুন আমাদের কাছে S এবং T দুটি স্ট্রিং আছে এগুলি ছোট হাতের অক্ষর দিয়ে গঠিত। S-তে কোনো অক্ষর একাধিকবার আসে না। S কে আগে কিছু কাস্টম ক্রমে সাজানো হয়েছিল। আমাদের T-এর অক্ষরগুলিকে পারমিউট করতে হবে যাতে তারা S সাজানো ক্রম অনুসারে মেলে। আরও নির্দিষ্টভাবে, যদি S-তে y-এর আগে x হয়, তাহলে ফিরে আসা স্ট্রিং-এ y-এর আগে x আসবে।
সুতরাং যদি S =“cba” এবং T =“abcd”, তাহলে আউটপুট হবে “cbad”। এখানে "a", "b", "c" S তে দেখা যাচ্ছে, তাই "a", "b", "c" এর ক্রম "c", "b", এবং "a" হতে হবে। যেহেতু "d" S-তে প্রদর্শিত হয় না, এটি T-এর যেকোনো অবস্থানে থাকতে পারে। "dcba", "cdba", "cbda"ও বৈধ আউটপুট।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
খালি স্ট্রিং হিসাবে ret সেট করুন
-
একটি মানচিত্র m সংজ্ঞায়িত করুন এবং T-এ উপস্থিত প্রতিটি অক্ষরের ফ্রিকোয়েন্সি m
এ সংরক্ষণ করুন -
i এর জন্য 0 থেকে S – 1
এর আকার-
x :=S[i]
-
j-এর জন্য 0 থেকে m[x] – 1
পরিসরে-
ret :=ret + x
-
-
m[x] :=0
-
-
প্রতিটি জোড়ার জন্য এটি m −
-
যদি এর মান হয়> 0, তাহলে
-
i এর জন্য রেঞ্জ 0 থেকে এর মান - 1
-
ret :=এটার ret concatenate কী
-
-
-
-
রিটার্ন রিটার্ন
উদাহরণ(C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h> using namespace std; class Solution { public: string customSortString(string S, string T) { string ret = ""; unordered_map <char, int> m; for(int i = 0; i < T.size(); i++){ m[T[i]]++; } for(int i = 0; i < S.size(); i++){ char x = S[i]; for(int j = 0; j < m[x]; j++){ ret += x; } m[x] = 0; } unordered_map <char, int> :: iterator it = m.begin(); while(it != m.end()){ if(it->second > 0){ for(int i = 0; i < it->second; i++)ret += it->first; } it++; } return ret; } }; main(){ Solution ob; cout << (ob.customSortString("cba", "abcd")); }
ইনপুট
"cba" "abcd"
আউটপুট
cbad