LeetCode热题100--205
LeetCode热题100–205. 同构字符串
题目链接
题目类型: 哈希表、字符串
给定两个字符串 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 字符组成
解题思路
- 使用两个哈希表
a
和b
:a
记录s → t
的映射。b
记录t → s
的映射。
- 遍历字符串,检查当前字符的映射是否冲突:(解题关键点)
- 如果
s[i]
已经映射到t[i]
,但a[s[i]] != t[i]
→ 冲突。 - 如果
t[i]
已经映射到s[i]
,但b[t[i]] != s[i]
→ 冲突。
- 如果
- 如果没有冲突,就建立双向映射关系。
通过代码
class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char,char> a,b;for(int i=0; i<s.size(); i++){if(a[s[i]] != 0 && a[s[i]] != t[i] || b[t[i]] != 0 && b[t[i]] != s[i]){return false;}a[s[i]] = t[i];b[t[i]] = s[i];}return true;}
};
边界情况
(1)字符串长度不同
- 题目保证
s.size() == t.size()
,所以不需要额外检查。
(2)空字符串
s = ""
,t = ""
→true
(空字符串是同构的)。
(3)字符映射到自身
s = "abc"
,t = "abc"
→true
(每个字符映射到自身)。
(4)多个字符映射到同一个字符
s = "badc"
,t = "baba"
→false
(a
和c
都映射到b
,冲突)。
5. 复杂度分析
操作 | 时间复杂度 | 空间复杂度 |
---|---|---|
遍历字符串 | O(n) | O(1)(最多 256 种 ASCII 字符) |
哈希表查询 | O(1) | O(1) |
哈希表插入 | O(1) | O(1) |
- 时间复杂度:
O(n)
(遍历一次字符串)。 - 空间复杂度:
O(1)
(最多存储 256 种 ASCII 字符的映射)。
6. 总结
- 核心思想:使用双向哈希表检查字符映射是否唯一。
- 关键点:
- 检查
s → t
和t → s
的映射是否一致。 - 如果发现冲突,立即返回
false
。
- 检查
- 优化空间:
- 可以用数组代替哈希表(因为 ASCII 字符范围固定)。
- 但哈希表写法更直观,适合面试时快速实现。