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

Viktor Karpov
Feb 25, 2017 · 2 min read

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


Прежде всего, стоит уточнить о какой кодировке идет речь: обычной 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. Все опубликованные мною решения можно найти по фильтру.

Viktor Karpov

Written by

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade