ধরুন আমরা একটি স্ট্রিং s এবং স্ট্রিং জোড়ায় সূচকের জোড়ার একটি অ্যারে দিয়েছি যেখানে জোড়া[i] =[a, b] স্ট্রিংয়ের 2টি সূচক (0-সূচীযুক্ত) নির্দেশ করে। আমরা যতবার চাই ততবার প্রদত্ত জোড়ার যেকোন জোড়া সূচকে অক্ষরগুলিকে অদলবদল করতে পারি। আমাদের আভিধানিকভাবে সবচেয়ে ছোট স্ট্রিংটি খুঁজে বের করতে হবে যেটি s সোয়াপ ব্যবহার করার পরে পরিবর্তন করা যেতে পারে। সুতরাং ইনপুট যদি s =“dcab” এবং জোড়া =[[0,3], [1,2]] এর মত হয়, তাহলে আউটপুট হবে “bacd”। বিনিময় করুন s[0] এবং s[3], s ="bcad", তারপর বিনিময় করুন s[1] এবং s[2], s ="bacd"।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=অ্যারের আকার, অভিভাবক :=n আকারের একটি অ্যারে তৈরি করুন এবং এটি -1 দিয়ে পূরণ করুন
-
ret of size n নামে একটি স্ট্রিং তৈরি করুন এবং এটি *
দিয়ে পূরণ করুন -
আমার জন্য 0 থেকে জোড়ার আকারের মধ্যে
-
u :=জোড়া[i, 0] এবং v :=জোড়া[i, 1]
-
যদি u-এর অভিভাবক v-এর পিতা-মাতার সমান হয়, তাহলে পরবর্তী পুনরাবৃত্তিতে চলে যান
-
পিতামাতা [u এর পিতামাতা] :=v
এর পিতামাতা
-
-
n
আকারের একটি অ্যারে arr1 সংজ্ঞায়িত করুন -
0 থেকে n – 1 রেঞ্জের i জন্য:arr[i-এর পিতামাতা]
-এ s[i] ঢোকান -
0 থেকে n – 1 রেঞ্জের i এর জন্য:ডান থেকে মান পড়ে arr[i] সাজান
-
0 থেকে n – 1 −
রেঞ্জের i জন্য-
ret[i] :=arr1[i-এর পিতা]
এর শেষ এন্ট্রি -
arr1[i-এর পিতা]
থেকে শেষ নোড মুছুন
-
উদাহরণ (C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
class Solution { public: vector <int> parent; int getParent(int x){ if(parent[x] == -1) return x; return parent[x] = getParent(parent[x]); } string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) { int n = s.size(); parent = vector <int>(n, -1); string ret(n, '*'); for(int i = 0; i < pairs.size(); i++){ int u = pairs[i][0]; int v = pairs[i][1]; if(getParent(u) == getParent(v)) continue; parent[getParent(u)] = getParent(v); } vector < char > arr1[n]; for(int i = 0; i < n; i++){ arr1[getParent(i)].push_back(s[i]); } for(int i = 0; i < n; i++){ sort(arr1[i].rbegin(), arr1[i].rend()); } for(int i = 0; i < n; i++){ ret[i] = arr1[getParent(i)].back(); arr1[getParent(i)].pop_back(); } return ret; } };
ইনপুট
"dcab" [[0,3],[1,2]]
আউটপুট
"bacd"