Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
For example,
Given "egg"
, "add"
, return true.
Given "foo"
, "bar"
, return false.
Given "paper"
, "title"
, return true.
Note:
You may assume both s and t have the same length.
写法一:
满足要求的关键点是,
当s,中一个字符,与t一个字符在对等位置首次建立映射后,
那么在后续位置,当字符再次出现时,该位置处的映射将要满足第一次建立的映射。
反之,从t到s也要满足上述关系。
class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map<char, char> m_st;
unordered_map<char, char> m_ts;
for (int i=0; i<s.size(); i++) {
auto res = m_st.insert(make_pair(s[i], t[i]));
if (!res.second && res.first->second != t[i])
return false;
res = m_ts.insert(make_pair(t[i], s[i]));
if (!res.second && res.first->second != s[i])
return false;
}
return true;
}
};
写法二:
用数组代替unordered_map,以提高效率。
class Solution {
public:
bool isIsomorphic(string s, string t) {
char map_s[256] = {0};
char map_t[265] = {0};
for (int i=0; i<s.size(); i++) {
if (!map_s[s[i]])
map_s[s[i]] = t[i];
else if (map_s[s[i]] != t[i])
return false;
if (!map_t[t[i]])
map_t[t[i]] = s[i];
else if (map_t[t[i]] != s[i])
return false;
}
return true;
}
};
写法三,
再次作改进,
上述正向映射,反身映射,都是字符到字符的映射。
如果将映射改成,字符到 位置的映射,将会更简洁。
一旦s和t中,对等位置字符建立映射关系后,两边字符同时映射到该位置。
即映射到相同位置,则满足映射关系。
class Solution {
public:
bool isIsomorphic(string s, string t) {
int map_s[256] = {0};
int map_t[256] = {0};
for (int i=0; i<s.size(); i++) {
if (map_s[s[i]] != map_t[t[i]])
return false;
map_s[s[i]] = i+1;
map_t[t[i]] = i+1;
}
return true;
}
};