#include <stdio.h>
#include <string.h>
/* 找出一个字符串最大相同子串,如果有多个重复子串,则要求返回最后一个位置的子串
*/
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;
}