Вариант 2 - лучший из трех - хеширование выполняется быстрее, чем поиск.
Однако есть еще более быстрый метод, если у вас достаточно памяти для него.
Воспользуйтесь тем, что набор символов ограничен и уже перечислен, и следите за тем, что появилось, а что нет, когда вы проверяете каждый символ.
Например, если вы используете однобайтовые символы, есть только 256 возможностей. Вам нужно всего лишь 256 бит, чтобы отслеживать, как вы читаете строку. Если встречается символ 0x00, переверните первый бит. Если встречается символ 0x05, переверните шестой бит и т. Д. Когда встречается уже перевернутый бит, строка не уникальна.
Это худший случай O (min (n, m)), где n - длина строки, а m - размер набора символов.
И, конечно же, как я заметил в комментарии другого человека, если n> m (т.е. длина строки> размер набора символов), то по принципу "голубиного отверстия" существует повторяющийся символ, определяемый в O (1) время.