Общий алгоритм для вывода, если строка содержит все уникальные символы (и не использует каких-либо других структур данных), говорит, чтобы пройти через строку, итерируя каждую букву по всей строке, ища совпадение. Этот подход O (n ^ 2).
Приведенный ниже подход (написанный на языке C) использует смещение для итерации над строковой частью, поскольку, например, в короткой строке нет оснований проверять последний символ с первым символом, как это сделал первый символ.
Мой вопрос заключается в следующем: является ли время выполнения алгоритма O (n!) или что-то вроде O (nlogn)?
#include <stdio.h>
int strunique(const char *str)
{
size_t offset = 1;
char *scout = (char *)str, *start;
for (; *scout != '\0'; ++scout, ++offset)
for (start = (char *)str + offset; *start != '\0'; ++start)
if (*start == *scout)
return 0;
return 1;
}
int main(void)
{
printf("%d\n", strunique("uniq"));
printf("%d\n", strunique("repatee"));
return 0;
}