สมมติว่าเราได้ให้สตริง s และอาร์เรย์ของคู่ดัชนีในคู่สตริง โดยที่ pairs[i] =[a, b] หมายถึง 2 ดัชนี(0-indexed) ของสตริง เราสามารถสลับอักขระที่คู่ของดัชนีใด ๆ ในคู่ที่กำหนดจำนวนครั้งตามที่เราต้องการ เราต้องหาสตริงที่เล็กที่สุดเกี่ยวกับพจนานุกรมที่สามารถเปลี่ยนเป็นหลังจากใช้การสลับ ดังนั้นหากอินพุตเป็นเหมือน s =“dcab” และคู่ =[[0,3], [1,2]] เอาต์พุตจะเป็น “bacd” แลกเปลี่ยน s[0] และ s[3], s ="bcad" จากนั้นแลกเปลี่ยน s[1] และ s[2], s ="bacd"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของอาร์เรย์ parent :=สร้างอาร์เรย์ขนาด n แล้วเติมด้วย -1
-
สร้างสตริงที่เรียกว่า ret ของ size n แล้วเติมด้วย *
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของคู่
-
u :=pairs[i, 0] and v :=pairs[i, 1]
-
ถ้า parent ของ u เหมือนกับ parent ของ v ให้ข้ามไปที่การวนซ้ำถัดไป
-
parent[parent of u] :=parent ของ v
-
-
กำหนดอาร์เรย์ arr1 ขนาด n
-
สำหรับฉันในช่วง 0 ถึง n – 1:ใส่ s[i] ลงใน arr[พาเรนต์ของ i]
-
สำหรับฉันในช่วง 0 ถึง n – 1:sort arr[i] โดยการอ่านค่าจากด้านขวา
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1 −
-
ret[i] :=รายการสุดท้ายของ arr1[parent of i]
-
ลบโหนดสุดท้ายออกจาก arr1[parent of 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"