给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s ="egg",
t ="add"
输出: true示例 2:
输入: s ="foo",
t ="bar"
输出: false示例 3:
输入: s ="paper",
t ="title"
输出: true说明:
你可以假设 s 和 t 具有相同的长度。
解法一
//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map<char, char> umc1, umc2;
for(int i = 0; i < s.size(); i++) {
if(!umc1.count(s[i])) umc1[s[i]] = t[i];
else if(t[i] != umc1[s[i]]) return false;
if(!umc2.count(t[i])) umc2[t[i]] = s[i];
else if(s[i] != umc2[t[i]]) return false;
}
return true;
}
};
解法二
//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:
bool isIsomorphic(string s, string t) {
int m1[256] = {0}, m2[256] = {0};
for (int i = 0; i < s.size(); ++i) {
if (m1[s[i]] != m2[t[i]]) return false;
m1[s[i]] = i + 1;
m2[t[i]] = i + 1;
}
return true;
}
};
解法一 用两个哈希表保存两个字符串的映射关系。之所以用两个而不是一个,是因为映射关系是单向的,即s->t跟t->的映射表是不一样的,但是都必须是一对一的映射(不能多对一,也不能一对多),思路就很清晰了,如上。 解法二 用两个数组代替哈希表,思路类似。
2019/04/27 23:19