Здесь находится решение O (n) (при условии, что фиксированный размер алфавита и доступ к словарю O (1)).
Используйте единую частотную таблицу, которая подсчитывает символы в seq1 и вниз для символов в seq2. У нас будет соответствующее окно, если эта гистограмма снова примет такое же значение (так как это означает, что мы должны иметь одинаковое количество промежуточных символов).
Таким образом, мы используем словарь для хранения предыдущих значений для гистограммы.
реализация Python:
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"))
Если вы имели больший алфавит вы могли бы использовать подобную технику только хранить хэш-значение вместо полной гистограммы. Например, вы можете просто выбрать случайный код для каждого символа и добавить код для каждой буквы в seq или вычесть для букв в seq2.
Вам понадобится второй проход, чтобы проверить, что предложенные совпадения были правильными в случае хеш-столкновения.
По мутировали, вы имеете в виду, что буквы можно переставить? – jamylak
@jamylak да, вы правы.Что-то вроде анаграмм, последовательность в другой строке может быть анаграммой последовательности в первой строке или наоборот. – Amit
Это называется перестановка – blue