一、题目描述
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
二、测试用例
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
1 <= s.length <= 5 * 104
t.length == s.length
s 和 t 由任意有效的 ASCII 字符组成
三、解题思路
- 基本思路:
建立字符间的对应关系并检查是否冲突即可 - 具体思路:
- 定义两个映射集 m1 和 m2 ,分别储存 s → t s\rightarrow t s→t 和 t → s t\rightarrow s t→s 的映射关系
- 建立关系与检查冲突:如果对应集合中不存在该关系就建立,如果存在就检查是否冲突。
四、参考代码
时间复杂度:
O
(
n
)
\Omicron(n)
O(n)
空间复杂度:
O
(
1
)
\Omicron(1)
O(1) map 的键值为 char 类型,最多就 128 个,所以是常量级空间
class Solution {
public:
bool isIsomorphic(string s, string t) {
int n = s.length();
map<char, char> m1, m2;
for (int i = 0; i < n; i++) {
if (m1.count(s[i]) == 1) {
if (m1[s[i]] != t[i])
return false;
} else {
m1[s[i]] = t[i];
}
if (m2.count(t[i]) == 1) {
if (m2[t[i]] != s[i])
return false;
} else {
m2[t[i]] = s[i];
}
}
return true;
}
};