สมมติว่าเรามี S และ T สองสตริงที่ประกอบด้วยตัวอักษรพิมพ์เล็ก ใน S ไม่มีตัวอักษรเกิดขึ้นมากกว่าหนึ่งครั้ง S ถูกจัดเรียงตามลำดับที่กำหนดเองก่อนหน้านี้ เราต้องเปลี่ยนอักขระของ T เพื่อให้ตรงกับลำดับที่ S ถูกจัดเรียง โดยเฉพาะอย่างยิ่ง ถ้า x เกิดขึ้นก่อน y ใน S ดังนั้น x จะเกิดขึ้นก่อน y ในสตริงที่ส่งคืน
ดังนั้นหาก 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
-
สำหรับผมอยู่ในช่วง 0 ถึงขนาด S – 1
-
x :=S[i]
-
สำหรับ j ในช่วง 0 ถึง m[x] – 1
-
ret :=ret + x
-
-
ม[x] :=0
-
-
สำหรับแต่ละคู่ในหน่วย m -
-
ถ้าค่าของมันคือ> 0 แล้ว
-
สำหรับฉันอยู่ในช่วง 0 ถึงค่าของมัน – 1
-
ret :=ret เชื่อมคีย์ของมัน
-
-
-
-
รีเทิร์น
ตัวอย่าง(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