สมมติว่าเรามีสองสตริง s และ t; เราต้องตรวจสอบก่อนว่าเป็นไอโซมอร์ฟิคหรือไม่ สตริงสองสายเรียกว่า isomorphic หากอักขระใน s สามารถแทนที่เพื่อรับ t ได้
ทุกรายการของอักขระต้องถูกแทนที่ด้วยอักขระอื่นในขณะที่รักษาลำดับของอักขระ ห้ามอักขระสองตัวจับคู่กับอักขระตัวเดียวกัน แต่อักขระหนึ่งตัวอาจจับคู่กับตัวมันเอง
ดังนั้น หากอินพุตเป็นเหมือน s ="egg", t ="add" ผลลัพธ์จะเป็นจริง เนื่องจาก e สามารถจับคู่กับ a และ g สามารถจับคู่กับ d ได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ arr ขนาด 256 และเติมด้วย -1
-
กำหนดอาร์เรย์ที่เข้าชมขนาด 256 และเติมด้วย 0
-
กำหนดอาร์เรย์ที่เข้าชม 1 ขนาด 256 และเติมด้วย 0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ถ้า visit[s[i]] เหมือนกับ 1 หรือ visit1[t[i]] เหมือนกับ 1 แล้ว −
-
ถ้า arr[s[i]] ไม่เท่ากับ t[i] - ASCII ของ 'a' ดังนั้น −
-
คืนค่าเท็จ
-
-
-
มิฉะนั้น
-
เยี่ยมชม[s[i]] :=1
-
เยี่ยมชม1[t[i]] :=1
-
arr[s[i]] :=t[i] - ASCII ของ 'a'
-
-
-
คืนความจริง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isIsomorphic(string s, string t) { vector<int> arr(256, -1); vector<bool> visited(256, 0); vector<bool> visited1(256, 0); for (int i = 0; i < s.length(); i++) { if (visited[s[i]] == 1 || visited1[t[i]] == 1) { if (arr[s[i]] != t[i] - 'a') { return false; } } else { visited[s[i]] = 1; visited1[t[i]] = 1; arr[s[i]] = t[i] - 'a'; } } return true; } }; main(){ Solution ob; cout << (ob.isIsomorphic("sky","fry")); }
อินพุต
"sky","fry"
ผลลัพธ์
1