Given two lowercase alphabet strings s and t return whether you can create a 1-to-1 mapping for each letter in s to another letter (could be the same letter) such that s could be mapped to t, with the ordering of characters preserved.
Input: s = "coco", t = "kaka" Output: True Explanation: We can create this mapping: "c" -> "k" "o" -> "a" Input: s = "cat", t = "foo" Output: False Explanation: We can't transform both "a" and "t" into "o" Since it has to be a 1-to-1 mapping.
Approach:
This problem mentions a mapping so immediately we realize we need to use a “map” data structure to take one character and return another.
But, it is a 1 to 1 mapping, i.e. if a -> c then x -> c is not allowed ( no other char can map to c except a ).
So we need to use two maps to make sure that it is 1 to 1 mapping.
Follow the steps below to solve the problem:
- Initialize two Hashmaps st and ts, to make sure 1-to-1 mapping happens.
- If the length of s is not equal to the length of t, then s can not be transformed to t. Hence, return false.
- Iterate over characters of the string s and check the s -> t mapping,
- if it is already present or appear for the first time do st[s[i]] = t[i] else return false.
- Again check the t -> s mapping (same logic as above).
Below is the implementation of the above approach:
#include <bits/stdc++.h> using namespace std; bool solve(string s, string t) { unordered_map<char, char> st, ts; // check whether length of s and t are equal or not // if not equal, its not possible to map return 0 if (s.size() != t.size()) return 0; for (int i = 0; i < s.size(); i++) { // check the s -> t mapping if (not st.count(s[i]) or st[s[i]] == t[i]) // this is the first time I've seen this char in // s, or second time with the same mapped value // as last time st[s[i]] = t[i]; else return false; // check the t -> s mapping (same logic as above) if (not ts.count(t[i]) or ts[t[i]] == s[i]) ts[t[i]] = s[i]; else return false; } return true; } // driver code int main() { string s = "coco"; string t = "kaka"; // function call bool result = solve(s, t); if (result) cout << "True"; else cout << "False"; return 0; }
Output:
True
Time Complexity: O(n)
Auxiliary Space: O(n)