实际上,每个子串长度的线性时间是可能的,因为您只需要连续相同的子串.只需将计数器保留为相同的字符,并在找到子字符串时更新字符串.由于您要删除所有可能长度的子字符串,因此整体复杂性是二次的.
以下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