在 Python 中检查两个字符串是否同构

2025年3月17日 | 阅读 7 分钟

在 Python 中检查两个字符串是否同构的问题,涉及比较给定的两个字符串,并确定它们之间是否存在一对一的字符映射或对应关系。

换句话说,如果两个字符串具有相同的字符模式,并且一个字符串中的每个字符都映射到另一个字符串中的相应字符,那么这两个字符串就被称为同构的。

例如,字符串 “egg” 和 “add” 是同构的,因为字符 ‘e’ 映射到 ‘a’,而 ‘g’ 映射到 ‘d’。

字符串 “abca” 和 “xywz” 不是同构的,因为字符 ‘a’ 可以映射到 ‘x’ 或 ‘z’。

该问题的目标是实现一个 Python 函数,该函数接受两个字符串作为输入,如果它们同构则返回 True,否则返回 False。这个问题可以通过各种技术来解决,例如创建一个字典来存储字符之间的映射,或者使用两个单独的字典来同时检查一对一和满射映射。

方法 1 - 使用字典存储字符之间的映射

程序可以总结如下:

  • 检查两个字符串的长度是否相等。如果不相等,则返回 False。否则,按照以下步骤进行。
  • 创建一个空的字典,用于存储字符之间的映射。
  • 使用 for 循环,通过索引迭代两个字符串的每个字符。
    • 检查 str1[i] 是否作为键存在于字典中。
    • 如果不存在,则:
      • 检查 str2[i] 是否已被映射到另一个字符。
      • 如果是,则返回 False。
      • 否则,添加 str1[i] 和 str2[i] 之间的新映射。
    • 如果存在,则检查 str1[i] 和 str2[i] 之间的映射是否一致。
      • 如果不一致,则返回 False。

如果在循环中没有发现任何不一致之处,则返回 True,表示这两个字符串是同构的。

输出

The two strings are isomorphic.

说明

在上面的程序中,isIsomorphic 函数使用一个名为 char_map 的字典来存储 str1 和 str2 中字符之间的映射,并首先检查 str1 和 str2 的长度是否相同,因为只有当两个字符串具有相同数量的字符时,它们才能同构。如果两个字符串的长度不同,则函数返回 False。

然后,该函数循环遍历 str1 中的每个字符,并检查当前字符是否已映射到 str2 中的字符。如果当前字符尚未映射,则该函数在 char_map 中添加一个新映射。如果当前字符已映射,则该函数会检查该映射是否与 str2 中的当前字符一致。如果映射不一致,则函数返回 False。

如果函数在循环中没有发现任何不一致之处,则返回 True,表示这两个字符串是同构的。

方法 2 - 使用两个单独的字典来检查一对一和满射映射

程序可以总结如下:

  • 检查两个字符串的长度是否相等。如果不相等,则返回 False。否则,按照以下步骤进行。
  • 创建两个字典,例如 char_map1 和 char_map2。
  • 使用 for 循环迭代 str1 和 str2 中的每个字符。
  • 检查当前字符 str1[i] 是否已被映射。
  • 如果 str1[i] 不在 char_map1 中:
    • 检查 str2[i] 是否已被映射到另一个字符。
    • 如果 str2[i] 在 char_map2 中:则返回 False。
  • 添加新映射之间的字符。
    • char_map1[str1[i]] = str2[i]
    • char_map2[str2[i]] = str1[i]
  • 如果当前字符 str1[i] 已被映射:
    • 检查映射是否与 str2 中的当前字符一致。
    • 如果 char_map1[str1[i]] != str2[i] 或 char_map2[str2[i]] != str1[i]:则返回 False。
  • 如果在循环中没有发现任何不一致之处,则返回 True,表示这两个字符串是同构的。

输出

The two strings are isomorphic.

说明

isIsomorphic 函数首先检查 str1 和 str2 的长度是否相同,因为只有当两个字符串具有相同数量的字符时,它们才能同构。如果两个字符串的长度不同,则函数返回 False。

该函数使用两个名为 char_map1 和 char_map2 的字典来存储 str1 和 str2 中字符之间的映射。

然后,该函数使用 for 循环迭代 str1 中的每个字符,并检查当前字符是否已映射到 str2 中的字符。

如果 str1 中的当前字符尚未映射,则该函数会检查 str2 中的当前字符是否已映射到另一个字符。如果 str2 中的当前字符已映射到另一个字符,则函数返回 False。

否则,该函数在 char_map1 和 char_map2 中添加新映射。

如果 str1 中的当前字符已映射,则该函数会检查 char_map1 和 char_map2 中的映射是否与 str2 中的当前字符一致。如果映射不一致,则函数返回 False。

如果函数在循环中没有发现任何不一致之处,则返回 True,表示这两个字符串是同构的。

方法 3 - 使用 zip() 函数迭代每个字符

输出

The two strings are isomorphic.

说明

isIsomorphic() 函数首先检查两个字符串的长度是否相同。如果长度不相同,则函数返回 False,因为同构字符串必须具有相同的长度。

然后,它创建一个名为 char_map 的空字典,用于存储 str1 和 str2 中字符之间的映射。

然后,它使用 zip() 函数同时遍历两个字符串中的每个字符,zip() 函数返回一个迭代器,该迭代器聚合来自输入字符串的元素。

对于 str1 中的每个字符,函数会检查该字符是否已映射,方法是检查该字符是否存在于 char_map 字典的键中。如果该字符已在 char_map 中,则函数会检查该映射是否与 str2 中的当前字符一致。如果映射不一致,则函数返回 False,因为两个字符串不是同构的。

如果该字符不在 char_map 中,则函数会检查 str2 中的当前字符是否已映射到另一个字符,方法是检查该字符是否存在于 char_map 字典的值中。如果该字符已在 char_map.values() 中,则函数返回 False,因为两个字符串不是同构的。

否则,它添加新的字符映射,然后移至下一个迭代。在程序结束时,如果在循环中没有发现任何不一致之处,则返回 True,表示字符串是同构的。