Все ли символы в строке встречаются только один раз?

Viktor Karpov
2 min readFeb 25, 2017

--

Реализовать алгоритм, определяющий все ли символы в строке встречаются только один раз. Если при этом запрещено использовать дополнительные структуры данных?

Прежде всего, стоит уточнить о какой кодировке идет речь: обычной ASCII или Юникоде? От этого будет зависеть размер памяти, который потребуется для решения, но сама логика решения останется неизменной.

Одно из возможных решений — создать массив логических значений, где флаг с индексом i указывает, присутствует ли символ алфавита с этим индексом в строке. При повторном обнаружении этого символа можно сразу возвращать false . Также можно сразу вернуть false если длина строки превышает количество символов в алфавите.

Алгоритм имеет сложность по времени O(n) , где n — длина строки и по памяти O(1) . В принципе, можно считать, что и по времени сложность равна O(1) т.к. длина строки не может быть больше 128 .

А если при этом запрещено использовать дополнительные структуры данных, такие как битовый массив set ?

Если предположить, что количество букв в алфавите не превосходит 32, например, заранее известно, что используются только буквы a-z в нижнем регистре (26 штук), то можно переписать решение выше без использования массива — с использованием одного числа и побитовых операций.

Сперва решение может показаться немного неясным, но на самом деле логика ровно такая же, только вместо явного массива бит используется number, который является 32-битным вектором (JavaScript хранит числа в 32 битах).

На каждом шаге цикла «взводится» бит, который соответствует определенному символу в строке и проверяет, что на каждой следующей позиции ноль, т.е. раньше этот бит не был выставлен в единицу.

Это решения задач из книги Cracking the Coding Interview. Все опубликованные мною решения можно найти по фильтру.

--

--