编写 Python 程序查找两个字符串的不常见字符

2024 年 8 月 29 日 | 阅读 6 分钟

在本教程中,我们将编写 Python 程序来查找给定两个字符串的非公有字符。非公有字符是指存在于一个字符串但不在另一个字符串中,或存在于另一个字符串但不在第一个字符串中的字符。给定的字符串是小写字符,可以包含重复项。让我们通过以下示例来理解。

示例 -

为了解决这个问题,我们将采用以下方法。

方法 - 1:朴素方法

在此方法中,我们将使用两个循环来检查第一个字符串中的字符是否存在于第二个字符串中,反之亦然。

注意 - 输出字符串必须按排序格式显示。

让我们通过朴素方法的以下算法来理解。

算法

  1. 首先,我们将获取两个字符串 str1 和 str2 作为输入。
  2. 然后,我们定义一个空列表 uncommon_chars 来存储非公有字符。
  3. 现在,遍历 str1 并检查一个字符是否存在于 str2 中。
  4. 然后,检查该字符是否不在 str2 中,并且尚未添加到 uncommon_chars 中,然后将其添加到 uncommon_chars 并标记为已使用。
  5. 现在,遍历 str1 并检查一个字符是否存在于 str2 中。
  6. 如果该字符不存在于 str1 中,并且尚未添加到 ans 中,则将其添加到 ans 并标记为已使用。
  7. 按字典顺序对 ans 字符串进行排序。
  8. 如果 ans 为空,则打印 -1。否则,打印 ans 的内容。

让我们通过下面的代码来理解。

示例 -

输出

Uncommon characters: dehrw

解释 -

在上面的代码中,我们初始化一个空的 uncommon_chars 列表来存储找到的非公有字符。然后,我们遍历 str1 中的每个字符,并检查它是否不存在于 str2 中,并且尚未存在于 uncommon_chars 中。如果两个条件都满足,则将该字符添加到 uncommon_chars。同样,我们遍历 str2 中的每个字符并执行相同的检查。

最后,我们返回 uncommon_chars 列表,其中包含存在于 str1 或 str2 中但不同时存在于两者中的所有唯一字符。

此方法的 time complexity 为 O(n2),因为我们使用了嵌套循环。对于较大的字符串,它可能效率不高。

我们可以优化上述解决方案。让我们来理解另一种方法。

方法 - 2:使用哈希

在此方法中,我们将定义一个空字典并计算字符的频率。一旦我们获得每个字符的频率,我们就找到频率等于 1 的字符并将其添加到列表中。让我们通过以下示例来理解。

示例 -

输出

Uncommon characters: dehrw

解释 -

在上面的代码中,我们使用一个字典 char_freq 来存储 str1 和 str2 中字符的频率。我们遍历 str1 中的每个字符,并在 char_freq 中更新频率计数。然后,我们遍历 str2 中的每个字符并相应地更新频率计数。

计算频率后,我们创建一个空的 uncommon_chars 列表来存储非公有字符。我们遍历 char_freq 中的键值对,并检查频率是否为 1。如果是,则表示该字符是 str1 或 str2 特有的,然后我们将其添加到 uncommon_chars 中。

最后,我们返回 uncommon_chars,其中包含在两个字符串中找到的非公有字符。

上述代码的 time complexity 为 O(n),其中 n 是 str1 和 str2 中字符的总数。

方法 - 3:基于映射的技术

让我们理解下面的例子。

示例 -

输出

ailnopruy

解释 -

在上面的代码中,我们定义了一个函数 uncommon_chars(),它接受两个字符串参数 a 和 b,并返回一个包含两个字符串之间非公有字符的字符串。

然后,我们初始化两个大小为 26 的数组 mp1 和 mp2。这些数组分别表示字符串 a 和 b 中字符的出现情况。数组最初填充有零。

第一个循环遍历字符串 a 中的每个字符 char,并通过将 mp1 中相应的元素设置为 1 来标记该字符的出现。映射基于字符的 ASCII 值,通过从其减去 'a' 的 ASCII 值来获取数组中的相应索引。

同样,第二个循环遍历字符串 b 中的每个字符 char,并通过将 mp2 中相应的元素设置为 1 来标记该字符的出现。初始化一个空字符串 chars 来存储找到的非公有字符。下一个循环遍历 26 的范围,代表 26 个英文字母。

在此循环中,条件 mp1[i] ^ mp2[i] 检查索引 i 处的字符在 mp1 和 mp2 之间的出现情况是否不同。如果条件为 true,则表示该字符存在于 a 中或存在于 b 中,但不是两者都存在。

如果条件满足,则使用 chr 函数和 ASCII 值计算将与索引 i 对应的字符追加到 chars 字符串。

循环结束后,代码会检查 chars 是否仍然是空字符串。如果是,则表示没有找到非公有字符,因此函数返回“-1”。否则,它返回包含非公有字符的 chars 字符串。

最后,使用字符串“capital”和“country”调用该函数,并打印返回的结果。

方法 - 4:使用集合

在此方法中,我们将给定的字符串转换为集合,然后找到它们之间的对称差。让我们通过以下示例来理解。

示例 -

输出

bclpr
bclpr

解释 -

上面的代码将字符串转换为集合,找到集合之间的对称差以获得非公有字符,然后对字符进行排序并连接它们以形成一个排序的非公有字符字符串。