สมมติว่าเรามีสตริง A และ B ที่มีความยาวเท่ากัน ตอนนี้เราสามารถพูดได้ว่า A[i] และ B[i] เป็นอักขระที่เทียบเท่ากัน ตัวอย่างเช่น ถ้า A ="abc" และ B ="cde" เราก็มี 'a' ='c', 'b' ='d' และ 'c' ='e' อักขระที่เทียบเท่าจะเป็นไปตามกฎปกติของความสัมพันธ์ที่เท่าเทียมกัน:
-
การสะท้อนกลับ:'a' ='a'
-
สมมาตร:'a' ='b' หมายถึง 'b' ='a'
-
Transitivity:'a' ='b' และ 'b' ='c' หมายถึง 'a' ='c'
ตัวอย่างเช่น เมื่อได้รับข้อมูลการสมมูลจาก A และ B ข้างต้น S ="eed", "acd" และ "aab" เป็นสตริงที่เทียบเท่ากัน และ "aab" เป็นสตริงที่เทียบเท่ากับพจนานุกรมที่เล็กที่สุดของ S ที่นี่เราต้องหา สตริงเทียบเท่าพจนานุกรมที่เล็กที่สุดของ S โดยใช้ข้อมูลสมมูลจาก A และ B ส่งกลับคำทั้งหมดที่สามารถเกิดขึ้นได้ในลักษณะนี้ ตามลำดับพจนานุกรม
ดังนั้นหากอินพุตเป็น A ="parker", B ="morris" และ S ="parser" ผลลัพธ์จะเป็น "makkek" เนื่องจากตามข้อมูลเทียบเท่าใน A และ B เราสามารถจัดกลุ่มอักขระเป็น [m,p], [a,o], [k,r,s], [e,i] ดังนั้นอักขระในแต่ละกลุ่มจึงเท่ากันและจัดเรียงตามลำดับศัพท์ คำตอบคือ "มักเคะ"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้างอาร์เรย์ที่เรียกว่าพาเรนต์
-
กำหนดวิธีการที่เรียกว่า getParent() ซึ่งจะใช้อักขระ x
-
ถ้า parent[x – ASCII ของ 'a'] คือ -1 ให้คืนค่า x – ASCII ของ 'a'
-
parent[x – ASCII ของ 'a'] :=getParent(ASCII ของ 'a' + parent[x – ASCII ของ 'a'])
-
ส่งคืนพาเรนต์[x – ASCII ของ 'a']
-
สร้างเมธอดอื่นที่เรียกว่า union() ซึ่งต้องใช้ a และ b
-
parentA :=getParent(a) และ parent :=getParent(b)
-
ดังนั้น ถ้า parentA =parent ให้คืนค่าเป็นอย่างอื่นเมื่อ parentA
-
จากวิธีหลัก ให้ทำดังนี้ −
-
ตั้งค่า parent :=อาร์เรย์ขนาด 26 และเติมโดยใช้ -1
-
สำหรับผมอยู่ในช่วง 0 ถึง 25
-
ดำเนินการสหภาพ(A[i], B[i])
-
-
สร้างสตริงว่างหนึ่งรายการ
-
สำหรับผมอยู่ในช่วง 0 ถึงขนาด S
-
ret :=ret + getParent(S[i]) + ‘a’
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector <int> parent;
int getParent(char x){
//cout << x << "-- " << x-'a' << endl;
if(parent[x - 'a'] == -1) return x - 'a';
return parent[x - 'a'] = getParent('a' + parent[x - 'a']);
}
void unionn(char a, char b){
int parentA = getParent(a);
int parentB = getParent(b);
if(parentA == parentB) return;
if(parentA < parentB){
parent[parentB] = parentA;
}else{
parent[parentA] = parentB;
}
}
string smallestEquivalentString(string A, string B, string S) {
parent = vector <int>(26, -1);
for(int i = 0; i < A.size(); i++){
unionn(A[i], B[i]);
}
string ret = "";
for(int i = 0; i < S.size(); i++){
ret += getParent(S[i]) + 'a';
}
return ret;
}
};
main(){
Solution ob;
cout <<
(ob.smallestEquivalentString("parker","morris","parser"));
} อินพุต
"parker" "morris" "parser"
ผลลัพธ์
makkek