计算字符串中不同的5个字符子串的数量

时间:2014-08-12 21:57:41

标签: python algorithm

给定一个字符串,我想要计算len = 5的子串数。

例如:输入:“ABCDEFG”输出:3

而且我不确定在python中最简单快捷的方法是什么。有什么想法吗?

更新

我只想计算不同的子串。

输入:“AAAAAA” 子串:2次“AAAAA” 输出:1

7 个答案:

答案 0 :(得分:3)

>>> n = 5
>>> for s in 'ABCDEF', 'AAAAAA':
...     len({s[i:i+n] for i in range(len(s)-n+1)})
... 
2
1

答案 1 :(得分:2)

要获取子字符串,您可以使用NLTK,如下所示:

>>> from nltk.util import ngrams
>>> for gram in ngrams("ABCDEFG", 5):
...     print gram
... 
('A', 'B', 'C', 'D', 'E')
('B', 'C', 'D', 'E', 'F')
('C', 'D', 'E', 'F', 'G')

您可以应用Counter然后获取唯一的n-gram(及其频率),如下所示:

>>> Counter(ngrams("AAAAAAA", 5))
Counter({('A', 'A', 'A', 'A', 'A'): 3})

答案 2 :(得分:2)

使用列表理解(代码高尔夫)

findSubs=lambda s,v:[''.join([s[i+j] for j in range(v)]) for i,x in enumerate(s) if i<=len(s)-v]
findCount=lambda s,v:len(findSubs(s,v))

print findSubs('ABCDEFG', 5)  #returns ['ABCDE', 'BCDEF', 'CDEFG']
print findCount('ABCDEFG', 5) #returns 3

<强> 更新

对于您的更新,您可以将上面的列表转换为集合,返回列表,然后对字符串进行排序。

findUnique=lambda s,v:sorted(list(set(findSubs(s,v))))
findUniqueCount=lambda s,v:len(findUnique(s,v))

print findUnique('AAAAAA', 5)      #returns ['AAAAA']
print findUniqueCount('AAAAAA', 5) #returns 1

答案 3 :(得分:1)

只是长度减去4:

def substrings(s):
    return len(s) - 4

这是真的,因为您可以为第一个,第二个,......,第五个到最后一个字符创建一个子字符串作为子字符串的第一个字母。

答案 4 :(得分:1)

一般解决方案可能是:

def count(string, nletters):
  return max(0, len(string) - nletters + 1)

根据您的示例具有用例:

print count("ABCDEFG", 5)

答案 5 :(得分:1)

>>> how_much = lambda string, length: max(len(string) - length + 1, 0)
>>> how_much("ABCDEFG", 5)
3

答案 6 :(得分:1)

我很确定python不是一个很好的语言,但是如果你想要找到的不同子串的长度不小于5但是大于1000,你的主字符串非常长,那么线性你的问题的时间解决方案是建立一个后缀树,你可以在线阅读它们。长度为n的字符串的后缀树可以在O(n)时间内构建,遍历树也需要O(n)时间,并且通过遍历树的更高级别,您可以计算特定长度的所有不同子字符串,无论你想要的子串的长度如何,也在O(n)时间内。