哈希算法题目:同构字符串
字数 927 2025-10-26 11:43:54

哈希算法题目:同构字符串

题目描述:给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符,相同字符只能映射到同一个字符,字符可以映射到自己本身。

解题过程:

  1. 问题分析:我们需要建立 s 到 t 的双向映射关系。这意味着:

    • s 中的同一个字符不能映射到 t 中的两个不同字符
    • t 中的同一个字符不能被 s 中的两个不同字符映射
  2. 核心思路:使用两个哈希表(字典)来分别记录 s→t 和 t→s 的映射关系。遍历字符串的每个位置,检查当前字符对是否满足已有的映射关系。

  3. 具体步骤:
    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
  4. 示例演示(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
  5. 边界情况处理:

    • 两字符串长度不同时直接返回 false
    • 空字符串返回 true
    • 单字符字符串一定返回 true

这个解法通过维护两个映射表,确保了映射的双射性质,时间复杂度O(n),空间复杂度O(字符集大小)。

哈希算法题目:同构字符串 题目描述:给定两个字符串 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="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(字符集大小)。