我个人对解决这个问题提出了一个思路,但是开销很大。如果还有更好的想法,欢迎提出来共同探讨
思路:(拆分问题)
1.从第一个字符开始,查看可能重复的所有子字符串。(要重复,这个子字符串的长度不应该超过字符串长度的一半,并且两个字符或以上的才能是字符串)
2.字符串中除了最后两个字符不可能出现重复外,其他都可能出现重复
3.需要检查字符串中是否存在子字符串的函数
代码如下:
-
#include <string.h>
-
#include <stdio.h>
-
-
char * my_strstr(const char * s, const char * ss)
-
{
-
int i, len;
-
-
len = strlen(s) - strlen(ss);
-
-
for (i = 0; i < len; i ++)
-
{
-
if (!memcmp(&s[i], ss, strlen(ss)))
-
break;
-
}
-
-
if (i >= len)
-
return NULL;
-
-
return &s[i];
-
}
-
-
char * find_max_str(const char * s)
-
{
-
int i = 0,j = 0, max = 0;
-
int len = strlen(s);
-
char * p,* maxp = NULL;
-
char * ret = (char *)malloc(len >> 1);
-
-
-
if (!ret)
-
return NULL;
-
-
for (i = 0; i < len - i - 2; i ++)
-
{
-
for (j = 2; j <= (strlen(&s[i]) >> 1); j ++)
-
{
-
memset(ret, 0, len >> 1);
-
memcpy(ret, &s[i], j);
-
p = my_strstr(&s[i + 1], ret);
-
if (p)
-
{
-
if (j > max)
-
{
-
max = j;
-
maxp = p;
-
}
-
}
-
-
}
-
}
-
-
memset(ret, 0, len >> 1);
-
-
if (maxp == NULL)
-
{
-
free(ret);
-
ret = NULL;
-
}
-
else
-
{
-
memcpy(ret, maxp, max);
-
}
-
-
return ret;
-
}
-
-
int main(void)
-
{
-
char str[] = "ababcabcertabcdticketabcde";
-
char * p;
-
-
printf("%s\n", str);
-
-
p = find_max_str(str);
-
-
if (p)
-
{
-
printf("%s\n", p);
-
free(p);
-
}
-
-
return 0;
-
}
阅读(1557) | 评论(0) | 转发(0) |