Đây là giải pháp O (n) (giả sử kích thước bảng chữ cái cố định và truy cập từ điển O (1)).
Sử dụng một bảng tần số duy nhất đếm số ký tự trong seq1 và xuống cho các ký tự trong seq2. Chúng ta sẽ có một cửa sổ phù hợp nếu biểu đồ này lại có cùng giá trị (vì điều này có nghĩa là chúng ta phải có số ký tự trung gian giống hệt nhau).
Vì vậy, chúng tôi sử dụng từ điển để lưu trữ các giá trị trước đó cho biểu đồ.
Python thực hiện:
def find_window(seq1,seq2):
"""Yield length of matching windows"""
D={} # Dictionary with key=histogram, value = first position where this happens
H=[0]*26 # H[x] is count of x in seq1 - count of x in seq2
D[tuple(H)]=-1
for i,(a,b) in enumerate(zip(seq1,seq2)):
a=ord(a)-ord('A')
b=ord(b)-ord('A')
H[a]+=1
H[b]-=1
key=tuple(H)
if key in D:
yield i-D[key]
if key not in D:
D[key]=i
print max(find_window("ABCDEFG","DBCAPFG"))
Nếu bạn đã có một bảng chữ cái lớn hơn, bạn có thể sử dụng một kỹ thuật tương tự chỉ lưu trữ một giá trị băm thay vì toàn bộ biểu đồ. Ví dụ, bạn có thể chỉ cần chọn một mã ngẫu nhiên cho mỗi ký tự và thêm vào mã cho mỗi chữ cái trong seq, hoặc trừ cho các chữ cái trong seq2.
Bạn sẽ cần thẻ thứ hai để kiểm tra xem các kết quả được đề xuất có chính xác không trong trường hợp xảy ra xung đột băm.
Nguồn
2013-06-08 19:23:14
Bằng cách biến đổi, bạn có nghĩa các chữ cái có thể được sắp xếp lại? – jamylak
@jamylak vâng, bạn nói đúng.Một cái gì đó giống như đảo chữ cái, chuỗi trong chuỗi khác có thể là một đảo chữ cái của chuỗi trong chuỗi đầu tiên hoặc ngược lại. – Amit
nó được gọi là hoán vị – blue