Как решить эту проблему, связанную с перестановками, в сложности O(n^2)?

#arrays #algorithm #data-structures #permutation #sub-array

Вопрос:

Есть 2 массива A и B с длинами N и M, которые вы должны удалить по 1 элементу за раз из B и проверить, существует ли перестановка B в A

Пояснение: Пример:

 N = 5
A = [1,2,2,1,1]
M = 3
b = [1,2,1]
Output: [0,2,3]
 

Когда вы удаляете 1-й элемент из B, он становится [2,1]. Вы можете видеть в массиве A, что подмножество длины 2, начинающееся с индекса 0, равно [1,2], и поскольку [1,2] является перестановкой [2,1], у вас есть соответствие, соответствующее этому подмножеству. Аналогично, подмножество, начинающееся с индекса 2, также совпадает. Таким образом, теперь у вас есть 2 совпадения, соответствующие индексам 0 и 2. Теперь массив B восстановлен B = [1,2,1]

Теперь, когда вы удаляете 2-й элемент из B, он становится [1,1]. Для этого вы можете найти 1 совпадение, соответствующее подмассиву, начиная с индекса 3

удаление 3-го элемента бесполезно, так как мы удалили 1 раньше и проверили его

Следовательно, ответ [0,2,3]

Ответ №1:

Если мы ищем сложность O(n^2), хэшируйте каждое окно в A, где ключом является отсортированный список элементов в окне, а значениями являются индексы, где он виден. Для вашего примера мы бы:

 [1,2,2,1,1]

1,1,1,2,2 -> [0]
1,1,2,2   -> [0, 1]
1,2,2     -> [0, 1]
...
1,2       -> [0, 2]
etc.
 

мы также могли бы использовать мультимножество для ключа, если ожидается много дубликатов, например:

 1:3,2:2 -> [0]
 

Теперь создайте соответствующий ключ для каждого элемента, удаленного в B, по мере прохождения, и проверьте, есть ли ключ в хэш-таблице.

 B: {1: 2, 2: 1}

Traverse:

Key 1:1,2:1 -> indexes [0, 2]
...etc.