ให้สตริง s และ t ตัวพิมพ์เล็ก ทำการดำเนินการ: เลือกตัวอักษรใน s แล้วแทนที่ทุกครั้งที่ปรากฏด้วยตัวอักษรอื่น ทำซ้ำได้ไม่จำกัดครั้ง ต้องการทราบว่า s สามารถกลายเป็น t ได้หรือไม่
ตัวอย่าง: s = "eye", t = "pip" → True (แทนที่ 'e'→'p', 'y'→'i')
ขั้นตอนการแก้ปัญหา
- สร้าง Map m1 (char → char)
- วนลูป i = 0 ถึง n-1:
- ถ้า s[i] อยู่ใน m1 แล้ว:
- ถ้า m1[s[i]] == t[i] → ต่อไป
- มิฉะนั้น → คืนค่า false
- มิฉะนั้น: m1[s[i]] = t[i]
- ถ้า s[i] อยู่ใน m1 แล้ว:
- คืนค่า true
หมายเหตุ: ต้องตรวจสอบการแมปแบบ 1-1 (bijection) จึงควรมี m2 สำหรับทิศทางกลับด้วย
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
bool solve(string s, string t) {
unordered_map<char, char> m1, m2;
int n = s.size();
for (int i = 0; i < n; i++) {
if (m1.count(s[i])) {
if (m1[s[i]] == t[i]) continue;
return false;
} else {
m1[s[i]] = t[i];
}
if (m2.count(t[i])) {
if (m2[t[i]] == s[i]) continue;
return false;
} else {
m2[t[i]] = s[i];
}
}
return true;
}
int main() {
string s = "eye", t = "pip";
cout << solve(s, t);
return 0;
}
อินพุต
"eye", "pip"
เอาต์พุต
1