Действительно, линейное время возможно для каждой длины подстроки, поскольку вам нужны только последовательные идентичные подстроки.Просто держите счетчик идентичных символов и обновляйте строку, когда вы нашли подстроку.Поскольку вы хотите удалить подстроки всех возможных длин, общая сложность будет квадратичной.
Должен работать следующий код C:
char str[20]="abcababceccced";
int len = strlen(str);
int i, j, counter;
for(i = 1; i <= len / 2; ++i)
{
for(j = i, counter = 0; j < len; ++j)
{
if (str[j] == str[j - i])
counter++;
else
counter = 0;
if (counter == i)
{
counter = 0;
memmove(str + j - i, str + j, (len - j) * sizeof(char));
j -= i;
len -= i;
}
}
str[j] = 0;
printf("%s\n", str);
}
Это должно вывести последовательно:
abcababceced
abcabced
abced