📅  最后修改于: 2023-12-03 14:55:43.969000             🧑  作者: Mango
给定两个字符串s1和s2,确定它们是否有任何公共字符。
最简单直接的解决方案是将字符从一个字符串中取出来,与另一个字符串进行比对。这个过程称为暴力搜索。
暴力搜索的时间复杂度是 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
使用哈希表可以提高查找的效率。将一个字符串中的所有字符都添加到哈希表中,然后在另一个字符串中逐个查找是否有字符在哈希表中出现过。
哈希表的时间复杂度是 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
如果将两个字符串都排序,然后使用双指针依次比对,可以实现时间复杂度为 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
本文介绍了三种解决方案:暴力搜索、哈希表和排序及双指针。其中暴力搜索最简单直接,但是时间复杂度较高;哈希表效率更高,但是需要额外的空间;排序及双指针的时间和空间复杂度都相对较小,但是在实际应用中需要根据具体情况进行选择。
最后,给出一个综合效率和易读性较高的解决方案,如下所示:
def contains_common_char(s1, s2):
return len(set(s1) & set(s2)) > 0