📌  相关文章
📜  检查两个给定字符串是否有任何公共字符(1)

📅  最后修改于: 2023-12-03 14:55:43.969000             🧑  作者: Mango

检查两个给定字符串是否有任何公共字符

1. 问题描述

给定两个字符串s1和s2,确定它们是否有任何公共字符。

2. 解决方案
2.1 解法一:暴力搜索

最简单直接的解决方案是将字符从一个字符串中取出来,与另一个字符串进行比对。这个过程称为暴力搜索。

暴力搜索的时间复杂度是 O(mn),其中 m 和 n 分别是字符串 s1 和 s2 的长度。具体实现请参见下面的代码片段。

def brute_force(s1, s2):
    for c1 in s1:
        for c2 in s2:
            if c1 == c2:
                return True
    return False
2.2 解法二:哈希表

使用哈希表可以提高查找的效率。将一个字符串中的所有字符都添加到哈希表中,然后在另一个字符串中逐个查找是否有字符在哈希表中出现过。

哈希表的时间复杂度是 O(m),其中 m 是字符串 s1 的长度。具体实现请参见下面的代码片段。

def hash_table(s1, s2):
    char_set = set(s1)
    for c in s2:
        if c in char_set:
            return True
    return False
2.3 解法三:排序及双指针

如果将两个字符串都排序,然后使用双指针依次比对,可以实现时间复杂度为 O(mlogm+nlogn) 和空间复杂度为 O(1) 的解法。

具体实现请参见下面的代码片段。

def sort_and_compare(s1, s2):
    s1_arr = sorted(list(s1))
    s2_arr = sorted(list(s2))
    i = j = 0
    while i < len(s1_arr) and j < len(s2_arr):
        if s1_arr[i] == s2_arr[j]:
            return True
        elif s1_arr[i] < s2_arr[j]:
            i += 1
        else:
            j += 1
    return False
3. 总结

本文介绍了三种解决方案:暴力搜索、哈希表和排序及双指针。其中暴力搜索最简单直接,但是时间复杂度较高;哈希表效率更高,但是需要额外的空间;排序及双指针的时间和空间复杂度都相对较小,但是在实际应用中需要根据具体情况进行选择。

最后,给出一个综合效率和易读性较高的解决方案,如下所示:

def contains_common_char(s1, s2):
    return len(set(s1) & set(s2)) > 0