สมมติว่าเรามีสตริง A และ B สองสตริง สองสตริงนี้เป็น K-similar (โดยที่ K เป็นจำนวนเต็มที่ไม่ติดลบหนึ่งค่า) หากเราสามารถสลับตำแหน่งของตัวอักษรสองตัวใน A ตรง K ครั้งเพื่อให้สตริงที่ได้คือ B ดังนั้นเราจึงได้ สองแอนนาแกรม A และ B เราต้องหา K ที่เล็กที่สุดที่ A และ B เป็น K-similar
ดังนั้น หากอินพุตเป็น A ="abc", B ="bac" ผลลัพธ์จะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน swapp() ซึ่งจะใช้สตริง s, i, j,
-
x :=s[i], y :=s[j]
-
s[i] :=y, s[j] :=x
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
ถ้า A เหมือนกับ B ดังนั้น:ให้คืนค่า 0
-
กำหนดการเยี่ยมชมหนึ่งชุด
-
ใส่ A เข้าไป
-
กำหนดหนึ่งคิว q แทรก A ลงใน q
-
สำหรับการเริ่มต้น lvl :=1 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1) ทำ -
-
sz :=ขนาดของ q
-
ในขณะที่ sz ไม่ใช่ศูนย์ ให้ลด sz ลง 1 ในการวนซ้ำแต่ละครั้ง ให้ทำ -
-
curr :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
ผม :=0
-
ในขณะที่ (i <ขนาดของ curr และ curr[i] เท่ากับ B[i]) ทำ −
-
(เพิ่ม i ขึ้น 1)
-
-
สำหรับการเริ่มต้น j :=i + 1 เมื่อ j <ขนาดของ curr ให้อัปเดต (เพิ่ม j ขึ้น 1) ให้ทำ -
-
ถ้า curr[i] เหมือนกับ curr[j] แล้ว −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
ถ้า curr[j] ไม่เท่ากับ B[i] แล้ว −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
ถ้า curr[j] เหมือนกับ B[j] แล้ว −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
swapp(curr, i, j)
-
ถ้าสกุลเงินเหมือนกับ B แล้ว −
-
กลับเลเวล
-
-
หากไม่นับจำนวนครั้งที่เข้าเยี่ยมชม −
-
ใส่เคอร์เนลเข้าที่เข้าชมแล้ว
-
ใส่เคอร์เนลลงใน q
-
-
swapp(curr, i, j)
-
-
-
-
กลับ -1
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int kSimilarity(string A, string B) {
if (A == B)
return 0;
unordered_set<string> visited;
visited.insert(A);
queue<string> q;
q.push(A);
for (int lvl = 1; !q.empty(); lvl++) {
int sz = q.size();
while (sz--) {
string curr = q.front();
q.pop();
int i = 0;
while (i < curr.size() && curr[i] == B[i])
i++;
for (int j = i + 1; j < curr.size(); j++) {
if (curr[i] == curr[j])
continue;
if (curr[j] != B[i])
continue;
if (curr[j] == B[j])
continue;
swapp(curr, i, j);
if (curr == B)
return lvl;
if (!visited.count(curr)) {
visited.insert(curr);
q.push(curr);
}
swapp(curr, i, j);
}
}
}
return -1;
}
void swapp(string &s, int i, int j) {
char x = s[i];
char y = s[j];
s[i] = y;
s[j] = x;
}
};
main(){
Solution ob;
cout << (ob.kSimilarity("abc", "bac"));
} อินพุต
"abc", "bac"
ผลลัพธ์
1