मान लीजिए कि हमारे पास दो तार s और t हैं; हमें यह जांचना होगा कि वे समरूपी हैं या नहीं। दो स्ट्रिंग्स को आइसोमॉर्फिक कहा जाता है यदि s में वर्णों को t प्राप्त करने के लिए प्रतिस्थापित किया जा सकता है।
वर्णों के क्रम को बनाए रखते हुए किसी वर्ण की सभी घटनाओं को किसी अन्य वर्ण से प्रतिस्थापित किया जाना चाहिए। कोई भी दो वर्ण एक ही वर्ण के लिए मैप नहीं कर सकते हैं लेकिन एक वर्ण स्वयं को मैप कर सकता है।
इसलिए, यदि इनपुट s ="egg", t ="add" जैसा है, तो आउटपुट सही होगा, क्योंकि e, a को मैप कर सकता है, और g d को मैप कर सकता है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
256 आकार की सरणी को परिभाषित करें और -1 से भरें
-
256 आकार की देखी गई सरणी को परिभाषित करें और 0 से भरें
-
256 आकार के विज़िट किए गए 1 सरणी को परिभाषित करें और 0 से भरें
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
यदि विज़िट किया गया [s[i]] 1 के समान है या विज़िट किया गया1[t[i]] 1 के समान है, तो -
-
अगर arr[s[i]] t[i] - 'a' के ASCII के बराबर नहीं है, तो -
-
झूठी वापसी
-
-
-
अन्यथा
-
विज़िट किया गया[s[i]] :=1
-
विज़िट किया गया1[t[i]]:=1
-
arr[s[i]] :=t[i] - 'a' का ASCII
-
-
-
सही लौटें
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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