欢迎访问LeetCode题解合集
题目描述
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
- 可以假设 s 和 t 长度相同。
题解:
哈希。
使用两个哈希表,分别保存 s
到 t
的映射和 t
到 s
的映射。
从前往后遍历s
或者 t
,同一个字符不是第一次出现时,其对应的对方位置的字符必须满足映射关系,否则不同构。
时间复杂度:$O(n)$
额外空间复杂度:$O(n)$
class Solution {
public:
bool isIsomorphic(string s, string t) {
if ( s.empty() )
return t.empty();
unordered_map<char, char> stot;
unordered_map<char, char> ttos;
for ( int i = 0; i < s.size(); ++i ) {
if ( !stot.count( s[i] ) )
stot[s[i]] = t[i];
else if ( stot[s[i]] != t[i] )
return false;
if ( !ttos.count(t[i]) )
ttos[t[i]] = s[i];
else if ( ttos[t[i]] != s[i] )
return false;
}
return true;
}
};
/*
时间:8ms,击败:77.96%
内存:6.9MB,击败:91.89%
*/