#include
#include
/* 找出一个字符串最大相同子串,如果有多个重复子串,则要求返回最后一个位置的子串
*/
void print_sub(char *p, int len)
{
int save_len = len;
while(len && len--)
{
printf("%c ", *p++);
}
printf("(%d bytes)\n", save_len);
}
/* 从from开始长度为len的字符串定义为一个子串(from是固定的)
** 则把从to开始,找出是否含有该子串
** 返回最后一个指定长度的子串的位置
** 限定:字符串从左边开始处理,from必需比to小,且没有重叠
*/
const char * search_sub_str(const char * from, const char * to, int len)
{
const char * same_sub_str = NULL;
if((from + len - 1 >= to)||(from > to))
{
printf("check failed in %s\n", __FUNCTION__);
return NULL;
}
while(*to)
{
if(!strncmp(from, to, len))
{
same_sub_str = to;/* 找到最后一个相同子串 */
}
to++;
}
return same_sub_str;
}
int max_sub_str(const char * str, char **p)
{
const char * s;
char * result;
/* 假定用户传递的合格字符串 */
int len = strlen(str);
int find_len = 0;
int sub_len, max = 0;
int i;
//printf("len = %d\n", len);
for(i = 0; i < len; i++)
{
sub_len = 1;
s = str + i;
while(sub_len <= len/2)
{
/* 针对特定的sub_len长度找出最后一个子串,已经有一个循环 */
//if((s + sub_len*2) <= str + len)
result =(char *)search_sub_str(s, s + sub_len, sub_len);
if(result && max < sub_len)/* *p非空表示找到,并且需要更新找到的最大子串长度 */
{
*p = result;
find_len = sub_len;
max = sub_len;
}
sub_len++;
}
}
return find_len;
}
/*
** test case :
1
11
abcdabcd
dafabcdesdfdabcde
111111111111111
1111111111111111
dsjfaworjenafjadsjqwoperjewiorjioqwejrewfddfdfewqrewfd
dsjfaworjenafjadsjqwoperjewiorjioqwejrewfddfdfewqrewfdxxxrewfd
*/
int main() { char * p = NULL; char str[1000] = {}; int len; printf("Please input a string:\n"); if(gets(str) != NULL) { //printf("string start address is %p\n", str); len = max_sub_str(str, &p); //printf("find %p len =%d at last\n", p, len); if(p) { printf("max sub string:\n"); print_sub(p, len); printf("pos is %d\n", p - str + 1); } else printf("no max repeat sub string!\n"); } return 0; }