Найти любую перестановку двоичной строки заданного размера, отсутствующую в массиве

Опубликовано: 21 Сентября, 2022

Учитывая массив arr[] из N различных двоичных строк, каждая из которых имеет N символов, задача состоит в том, чтобы найти любую двоичную строку, содержащую N символов, такую, что она не встречается в данном массиве arr[] .

Пример:

Input: arr[] = {“10”, “01”}
Output: 00
Explanation: String “00” does not appear in array arr[]. Another valid string can be “11” which does not occur in the array arr[] as well.

Input: arr[] {“111”, “011”, “001”}
Output: 101
Explanation: String “101” does not appear in array arr[]. Another valid strings are “000”, “010”, “100”, and “110”.

Наивный подход: Данную проблему можно решить, сгенерировав все двоичные строки, имеющие N бит, и вернув 1 строку так, чтобы она не встречалась в данном массиве arr[] .

Временная сложность: O(2 N * N 2 )
Вспомогательное пространство: O(N)

Эффективный подход: Данную проблему можно оптимизировать, используя метод, аналогичный диагональному аргументу Кантора. Можно заметить, что результирующая строка должна иметь хотя бы один бит, отличный от всех строк в arr[] . Следовательно, результирующая двоичная строка может быть построена путем принятия дополнения 1 -го элемента 1 строки в качестве 1 -го элемента, дополнения 2- го элемента 2- й строки в качестве 2- го элемента и так далее. . Ниже приведены шаги, которые необходимо выполнить:

  • Создайте строку ans , в которой хранится результирующая строка. Изначально он пустой.
  • Перебрать заданные строки в диагональном порядке, т. е. 1 элемент 1 строки, 2- й элемент 2- й строки и т. д., и добавить дополнение значения по текущему индексу в строку ans .
  • Строка, сохраненная в ans после итерации по всему массиву arr[] , является одной из требуемых допустимых строк.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N)
Вспомогательное пространство: O(1)