获取给定字符串的唯一子字符串列表

时间:2019-07-24 14:10:35

标签: python python-3.x string

任务是在python中获取唯一的子字符串列表。

我目前正在将问题分解为两部分:获取所有子字符串的列表,然后获取唯一的子字符串。

我正在使用以下代码:

substrings=[]
for i in range(0,len(inputstring)+1):
    for j in range(i+1,len(inputstring)+1):
        substr=inputstring[i:j]
        substrings.append(substr)
uniq=[]
for ss in substrings:
    if ss not in uniq:
        uniq.append(ss)

是否有更快的方法来解决此问题,或者以更灵活的方式解决此问题的所谓python方法?

一个简单的示例字符串为:"aabaa",可能的子字符串为[a,a,b,a,a,aa,ab,ba,aa,aab,aba,baa,aaba,abaa,aabaa],这是结尾[a,b,aa,ab,ba,aab,aba,baa,aaba,abaa,aabaa]所需要的唯一子字符串

2 个答案:

答案 0 :(得分:0)

第二部分使用集合而不是列表。在列表中查找某些对象的成本为O(n),而在集合中查找的成本为O(1),而无需检查其是否新的。如果列表已经存在,则集不会添加任何内容。

substrings=[]
for i in range(0,len(inputstring)+1):
    for j in range(i+1,len(inputstring)+1):
        substr=inputstring[i:j]
        substrings.append(substr)
uniq=set()
for ss in substrings:
    uniq.add(ss)

答案 1 :(得分:0)

使用Itertools和Set。与Edwin的答案类似,但使用Itertools,并且在一行中。

import itertools

uniq=list(set([inputstring[x:y] for x, y in itertools.combinations(
            range(len(inputstring) + 1), r = 2)]))

基本上,您首先使用itertools查找所有组合,然后设置为查找唯一元素,然后转换为列表。

取自https://www.geeksforgeeks.org/python-get-all-substrings-of-given-string/的组合的代码

编辑以获得更清晰的解释: 首先,使用组合获取对应于子字符串的所有索引对。这里的技巧是itertools.combinations以所有(0,X)对开始,然后以(1,X)对开始,依此类推。由于我们使用的是组合而不是排列,因此当我们消除反向子字符串时,例如(1,0 ),因为它们会在(0,X)枚举中出现。

然后只需将它们与列表推导一起使用即可获取所有子字符串,使用集合来查找唯一元素,然后转换为列表。

希望有帮助