C/C++寻找最大重复子串
直接上代码,代码里有详细解释
#include <stdio.h>
#include <string.h>
/* 找出一个字符串最大相同子串,如果有多个重复子串,则要求返回最后一个位置的子串
*/
int sub_len;
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开始,找出是否含有该子串
** 返回最大子串出现的位置(数组下标)*/
const char* search_sub_str(const char* from, const char* to, int len)
{
const char* same_sub_str = NULL;//初始设为空
while (*to)
{
if (!strncmp(from, to, len))
//字符串比较函数,
//int strncmp ( const char * str1, const char * str2, size_t n );
//功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;
//若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
{
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 max = 0;
int i;
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 + 1, sub_len);
if (result && max < sub_len)/* *p非空表示找到,并且需要更新找到的最大子串长度 */
{
*p = result;
find_len = sub_len;
max = sub_len;
}
sub_len++;
}
}
return find_len;
}
int main()
{
char* p = NULL;
char str[1000] = {};
int len;
printf("请输入字符串:\n");
if (gets_s(str) != NULL)
{
len = max_sub_str(str, &p);
if (p)
{
printf("最大子串:\n");
print_sub(p, len);
printf("位置为第 %d个(数组下标)\n", p-str+2-sub_len);
}
else
printf("no max repeat sub string!\n");
}
return 0;
}