哈希算法题目:同构字符串
字数 927 2025-10-26 11:43:54
哈希算法题目:同构字符串
题目描述:给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符,相同字符只能映射到同一个字符,字符可以映射到自己本身。
解题过程:
-
问题分析:我们需要建立 s 到 t 的双向映射关系。这意味着:
- s 中的同一个字符不能映射到 t 中的两个不同字符
- t 中的同一个字符不能被 s 中的两个不同字符映射
-
核心思路:使用两个哈希表(字典)来分别记录 s→t 和 t→s 的映射关系。遍历字符串的每个位置,检查当前字符对是否满足已有的映射关系。
-
具体步骤:
a. 初始化两个空字典:s_to_t 记录 s 中字符到 t 中字符的映射,t_to_s 记录 t 中字符到 s 中字符的映射
b. 同时遍历 s 和 t 的每个字符(假设两字符串长度相等):- 如果当前 s[i] 在 s_to_t 中有映射,检查映射是否等于 t[i]:
- 如果不等于,说明映射冲突,返回 false
- 如果当前 s[i] 在 s_to_t 中没有映射,但 t[i] 已经在 t_to_s 中有映射:
- 说明 t[i] 已被其他字符映射,返回 false
- 如果都没有映射,则建立双向映射:s_to_t[s[i]] = t[i] 且 t_to_s[t[i]] = s[i]
c. 成功遍历完所有字符后,返回 true
- 如果当前 s[i] 在 s_to_t 中有映射,检查映射是否等于 t[i]:
-
示例演示(s="egg", t="add"):
- i=0: s[0]="e"→t[0]="a",建立映射 e→a 和 a→e
- i=1: s[1]="g"→t[1]="d",建立映射 g→d 和 d→g
- i=2: s[2]="g"应映射到"d",实际t[2]="d",符合映射,通过检查
- 最终返回 true
-
边界情况处理:
- 两字符串长度不同时直接返回 false
- 空字符串返回 true
- 单字符字符串一定返回 true
这个解法通过维护两个映射表,确保了映射的双射性质,时间复杂度O(n),空间复杂度O(字符集大小)。