给出了字符串列表,我如何找到重叠的序列
arr=['iloveapple','banana','ilove','ban']
substring_list=[]
for idx,s in enumerate(arr):
if idx==0:
substring_list.append(s)
else:
if any(s in x for x in substring_list):
continue
else:
substring_list.append(s)
print(substring_list)
当列表变大(> 1000)时,此方法非常慢。有没有更好的方法来解决这个问题。还是有更好的数据结构来存储这些重叠序列
答案 0 :(得分:2)
您可以将arr
中给定字符串的所有可能的子字符串添加到seen
集合中,以便您可以查看arr
中的新单词是否为的子字符串。任何以前的具有 O(1)时间复杂度的字符串:
seen = set()
substring_list = []
for s in arr:
if s not in seen:
substring_list.append(s)
seen.update({s[i:i + n + 1] for n in range(len(s)) for i in range(len(s) - n)})
substring_list
变为:
['iloveapple', 'ilovebanana']
答案 1 :(得分:1)
您可以通过列表理解来执行此操作,而跳过整个列表构建部分。
#make sure to sort the list first
arr = sorted(arr, key = len)
print([s for i, s in enumerate(arr) if all(s not in _ for _ in arr[i + 1:])])
#['iloveapple', 'ilovebanana']
答案 2 :(得分:0)
如果我正确理解了您的问题,我认为您需要后缀树。它们是最有效的字符串匹配数据结构。您可以以此为基础确定列表中的哪个字符串与其他字符串重叠。
from suffix_trees import STree
arr=['iloveapple','banana','ilove','ban']
suffix_arr = "".join(arr)
st = STree.STree(suffix_arr)
for i, s in enumerate(arr):
overlapped_index = st.find_all(s)
for index in overlapped_index:
print(arr[i], " overlaps ", index, suffix_arr[index:] )
答案 3 :(得分:0)
您可以尝试让字符串函数为您工作:
arr=['iloveapple','banana','ilove','ban']
allStrings = " ".join(arr)
substring_list = [ s for s in arr if len(allStrings.split(s))>2 ]
将所有字符串连接在一起(使用分隔符)将使您可以搜索单个文本池。知道每个字符串至少存在一个,因此,如果只有一个实例,那么在任何一个关键字上拆分组合字符串应该只给出两个部分。但是,如果存在重叠,则较小的关键字会出现多次,并导致其他拆分。