Thuật toán Knuth-Morris-Pratt là một phương pháp tốt để tìm một chuỗi bên trong một chuỗi khác [vì tôi đã thấy DNA, tôi đoán bạn muốn điều này để mở rộng lên hàng tỷ?].
# Knuth-Morris-Pratt string matching
# David Eppstein, UC Irvine, 1 Mar 2002
from __future__ import generators
def KnuthMorrisPratt[text, pattern]:
'''Yields all starting positions of copies of the pattern in the text.
Calling conventions are similar to string.find, but its arguments can be
lists or iterators, not just strings, it returns all matches, not just
the first one, and it does not need the whole text in memory at once.
Whenever it yields, it will have read the text exactly up to and including
the match that caused the yield.'''
# allow indexing into pattern and protect against change during yield
pattern = list[pattern]
# build table of shift amounts
shifts = [1] * [len[pattern] + 1]
shift = 1
for pos in range[len[pattern]]:
while shift = 0 and pattern[matchLen] != c:
startPos += shifts[matchLen]
matchLen -= shifts[matchLen]
matchLen += 1
if matchLen == len[pattern]:
yield startPos
Liên kết nơi tôi có mã KMP Python [và tích hợp, sẽ nhanh hơn cho các vấn đề nhỏ vì hằng số thời gian chạy].
Để có hiệu suất cạnh chảy máu, hãy sử dụng bảng tiền tố và băm các cửa sổ của chuỗi của bạn dưới dạng số nguyên cơ sở 4 [trong sinh học, bạn gọi chúng là K-MERS hoặc Oligos]. ; ]
Chúc may mắn!
Chỉnh sửa: Ngoài ra còn có một thủ thuật hay, bạn sắp xếp danh sách chứa mọi tiền tố [tổng n] trong chuỗi đầu tiên và mỗi tiền tố [tổng n] trong chuỗi thứ hai. Nếu họ chia sẻ phần tiếp theo chung lớn nhất, thì chúng phải liền kề trong danh sách được sắp xếp, vì vậy hãy tìm phần tử từ chuỗi khác gần nhất trong danh sách được sắp xếp, và sau đó lấy tiền tố dài nhất hoàn toàn. :] There's also a nice trick where you sort a list containing every prefix [n total] in the first string and every prefix [n total] in the second string. If they share the largest common subsequence, then they must be adjacent in the sorted list, so find the element from the other string that is closest in the sorted list, and then take the longest prefix that matches completely. : ]
Làm thế nào để bạn đếm số lượng chuỗi con trong một chuỗi trong Python?
Chức năng Python String Count [] là một hàm sẵn có trong ngôn ngữ lập trình Python trả về số lần xuất hiện của một chuỗi con trong chuỗi đã cho. Tham số: Hàm đếm [] có một bắt buộc và hai tham số tùy chọn.
Làm thế nào để tôi tìm thấy trong Python?
Làm thế nào để bạn đếm số lượng chuỗi con trong một chuỗi trong Python?
Chức năng Python String Count [] là một hàm sẵn có trong ngôn ngữ lập trình Python trả về số lần xuất hiện của một chuỗi con trong chuỗi đã cho. Tham số: Hàm đếm [] có một bắt buộc và hai tham số tùy chọn.
Làm thế nào để tôi tìm thấy trong Python?
Chuỗi python tìm [].
Examples:
Đầu vào: Chuỗi: Geeksforgeeksforgeeks Mẫu: Geeksforgeeks và NBSP;String: “geeksforgeeksforgeeks” ; Pattern: “geeksforgeeks”
Đầu ra: [0, 8] & nbsp; [0, 8]
Giải thích: Mẫu đang chồng chéo chuỗi từ chỉ mục 0 đến chỉ mục thứ 12 và một lần nữa chồng chéo nó từ chỉ số thứ 8 đến chỉ mục thứ 20. Do đó, đầu ra là vị trí bắt đầu của sự chồng chéo I.E INDEX 0 và INDEX 8. & NBSP; & NBSP; The pattern is overlapping the string from 0th index to 12th index and again overlapping it from 8th index to 20th index. Hence, the output is the starting positions of overlapping i.e index 0 and index 8.
Đầu vào: Chuỗi: Hồi Barfoobarfoobarfoobarfoobarfoo & nbsp; mẫu: Foobarfoo '& nbsp;String: “barfoobarfoobarfoobarfoobarfoo” ; Pattern: “foobarfoo”
Đầu ra: [3, 9,15, 21] & nbsp; [3, 9,15, 21]
Giải thích: Mẫu chồng chéo chuỗi từ INDEX 3, 9, 15 và 21. The pattern is overlapping the string from index 3, 9 , 15 and 21.
Phương thức này trả về số lượng của các chỉ số không chồng chéo từ một chuỗi có nhiều mẫu xảy ra chồng chéo. Dưới đây là một chương trình mô tả việc sử dụng phương thức findIter [].
Python3
import
re
def
CntSubstr[pattern, string]:
a
=
[0]6
[0]7
[0]8
=
[0, 8] [3, 9, 15, 21]0
[0, 8] [3, 9, 15, 21]1
=
[0, 8] [3, 9, 15, 21]3
[0, 8] [3, 9, 15, 21]4
[0, 8] [3, 9, 15, 21]5
Output:
[0]
Do đó, để có được các chỉ số chồng chéo cũng như chúng ta cần làm là thoát ra khỏi các biểu thức thông thường trong mẫu. Định nghĩa trong hàm rõ ràng giúp chọn các ký tự theo cách một phần.
Approach:
- Re.Finditer [] giúp tìm các chỉ số nơi xảy ra đối tượng đối sánh. Khi nó trả về một đối tượng có thể lặp lại, phương thức start [] giúp trả lại các chỉ số nếu không nó sẽ cho thấy rằng một đối tượng khớp đã được tìm thấy tại một số vị trí.
- Phương pháp tiêu chuẩn trong khớp bằng mô -đun RE là tham lam, điều đó có nghĩa là số lượng ký tự tối đa được khớp. Do đó,? = {0} giúp số lượng trận đấu tối thiểu.
- Để phù hợp với nó để các ký tự một phần được khớp, re.escape [] giúp thoát ra khỏi các ký tự đặc biệt đã được thêm vào trước đó như? = {0}.
- Kết quả là bằng cách thêm các sửa đổi SOM, phương thức findIter [] trả về một danh sách các chỉ số chồng chéo.
Dưới đây là việc thực hiện phương pháp trên:
Python3
import
re
def
CntSubstr[pattern, string]:
a
=
import
8import
9re
0re
1re
2
[0]6
[0]7
[0]8
=
[0, 8] [3, 9, 15, 21]0
[0, 8] [3, 9, 15, 21]1
=
[0, 8] [3, 9, 15, 21]3
Do đó, để có được các chỉ số chồng chéo cũng như chúng ta cần làm là thoát ra khỏi các biểu thức thông thường trong mẫu. Định nghĩa trong hàm rõ ràng giúp chọn các ký tự theo cách một phần.
Re.Finditer [] giúp tìm các chỉ số nơi xảy ra đối tượng đối sánh. Khi nó trả về một đối tượng có thể lặp lại, phương thức start [] giúp trả lại các chỉ số nếu không nó sẽ cho thấy rằng một đối tượng khớp đã được tìm thấy tại một số vị trí.
[0, 8] [3, 9, 15, 21]4
def
9[0, 8] [3, 9, 15, 21]4
CntSubstr[pattern, string]:
1Output:
[0, 8] [3, 9, 15, 21]
Phương pháp tiêu chuẩn trong khớp bằng mô -đun RE là tham lam, điều đó có nghĩa là số lượng ký tự tối đa được khớp. Do đó,? = {0} giúp số lượng trận đấu tối thiểu.
Để phù hợp với nó để các ký tự một phần được khớp, re.escape [] giúp thoát ra khỏi các ký tự đặc biệt đã được thêm vào trước đó như? = {0}.O[n]
Kết quả là bằng cách thêm các sửa đổi SOM, phương thức findIter [] trả về một danh sách các chỉ số chồng chéo.O[n]