समस्या विवरण
मान लीजिए हमारे पास दो स्ट्रिंग्स s और t हैं; हमें जांचना है कि वे आइसोमोर्फिक हैं या नहीं। दो स्ट्रिंग्स को आइसोमोर्फिक कहा जाता है यदि s में वर्णों को बदलकर t प्राप्त किया जा सकता है।
एक वर्ण की सभी घटनाओं को दूसरे वर्ण से बदला जाना चाहिए जबकि वर्णों के क्रम को संरक्षित रखा जाए। कोई दो वर्ण एक ही वर्ण पर मैप नहीं हो सकते लेकिन एक वर्ण स्वयं पर मैप हो सकता है।
उदाहरण
यदि इनपुट है: s = "egg", t = "add", तो आउटपुट होगा true, क्योंकि e, a पर मैप हो सकता है, और g, d पर मैप हो सकता है।
हल करने का दृष्टिकोण
इस समस्या को हल करने के लिए निम्नलिखित चरणों का पालन करें:
- आकार 256 की एक सरणी arr परिभाषित करें और -1 से भरें
- आकार 256 की एक सरणी visited परिभाषित करें और 0 से भरें
- आकार 256 की एक सरणी visited1 परिभाषित करें और 0 से भरें
- i := 0 से आरंभ करें, जब i < s की लंबाई, i को 1 से बढ़ाते हुए:
- यदि visited[s[i]] == 1 या visited1[t[i]] == 1:
- यदि arr[s[i]] != t[i] - 'a' का ASCII:
- false लौटाएं
- यदि arr[s[i]] != t[i] - 'a' का ASCII:
- अन्यथा:
- visited[s[i]] := 1
- visited1[t[i]] := 1
- arr[s[i]] := t[i] - 'a' का ASCII
- यदि visited[s[i]] == 1 या visited1[t[i]] == 1:
- true लौटाएं
C++ कार्यान्वयन
#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;
}
};
int main() {
Solution ob;
cout << (ob.isIsomorphic("sky","fry"));
return 0;
}
इनपुट
"sky","fry"
आउटपुट
1