本文目录
题目描述
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add" 输出:true
示例 2:
输入:s = "foo", t = "bar" 输出:false
示例 3:
输入:s = "paper", t = "title" 输出:true
个人C++解答
时间复杂度较高,待优化,可以多开一个哈希表,省去每次的从头遍历查找
GYL
class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map<char, char> Map;
int index = 0, flag = 0;
for (auto s_ : s) {
flag = 0;
for (auto pair : Map) {
if (pair.second == t[index]) {
flag = 1;
if (Map.find(s_) != Map.end()) {
if (Map[s_] == t[index]) {
break;
} else {
return false;
}
} else {
return false;
}
}
}
if (flag == 0) {
if (Map.find(s_) == Map.end()) {
Map[s_] = t[index];
} else if (Map[s_] == t[index]) {
} else {
return false;
}
}
index++;
}
return true;
}
};
优化代码
此次优化增大的内存开销,时间上没有太大的提升,但是代码更简洁了
GYL
class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map<char, char> sMap;
unordered_map<char, char> tMap;
for (int i = 0; i < s.size(); i++) {
if (sMap.count(s[i])) {
if (sMap[s[i]] != t[i]) {
return false;
}
} else {
if (tMap.count(t[i])) {
if (tMap[t[i]] != s[i]) {
return false;
}
}
tMap[t[i]] = s[i];
sMap[s[i]] = t[i];
}
}
return true;
}
};

