簡體   English   中英

計算字符串中不同的5個字符子串的數量

[英]Counting the number of different 5 characters substrings inside a string

給定一個字符串我想計算len = 5的子串數。

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

而且我不確定在python中最簡單快捷的方法是什么。 任何想法?

更新:

我只想計算不同的子串。

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

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

要獲取子字符串,您可以像這樣使用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')

您可以應用計數器 ,然后獲得唯一的n-gram(及其頻率),如下所示:

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

使用列表理解(代碼高爾夫)

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

它只是長度減去4:

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

這是正確的,因為您可以為第一個,第二個,......,第五個到最后一個字符創建子字符串作為子字符串的第一個字母。

一般解決方案可能是:

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

根據您的示例,其中包含用例:

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

我很確定python不是一個很好的語言來做這個,但如果你想要找到的不同子串的長度不小於5但是大於1000,你的主字符串非常長,那么線性時間解決方案你的問題是建立一個后綴樹,你可以在線閱讀它們。 長度為n的字符串的后綴樹可以在O(n)時間內構建,遍歷樹也需要O(n)時間,並且通過遍歷樹的更高級別,您可以計算特定長度的所有不同子字符串,無論你想要的子串的長度如何,也在O(n)時間內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM