查找连续字符串C语言编程,查找一个字符串中最大重复子串(C语言版)

#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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值