查找两个字符串中最大公共子串 -- C语言

思路

分别遍历两个字符串,一个是外循环,一个是内循环,当内、外循环发现有相同的字符的时候,从当前位置开始匹配common子串,并记录长度,如果长度大于max,则更新最长的公共子串;最后用memcpy将找到的最长公共子串拷贝到返回结果的字符串中,记得最后要加上'\0'

代码实现

char * commonStr(const char * str1, const char * str2){
	if(NULL == str1 || NULL == str2){
		printf("commonStr param error!\n");
		return false;
	}

	const char * p = NULL;
	const char * q = NULL;
	const char * start = NULL, *p1 = NULL, *q1 = NULL;
	char * commstr = NULL;
	int len = 0, max = 0;

	p = str1;
	while('\0' != *p){
		q = str2;
		while('\0' !=  *q){
			if(*p == *q){ /*发现相等的了, 开始匹配*/
				len = 0;
				p1 = p;
				q1 = q;

				if(NULL == start){
					start = p;
				}
				
				/*内循环查找common子串*/
				while(('\0' != *p1) && ('\0' != *q1) && (*p1 == *q1)){
					len++;
					p1++;
					q1++;
				}

				if(len > max){
					max = len;
					start = p;
				}
			}
			q++;
		}		
		p++;
	}

	commstr = (char *)malloc(max + 1);
	memset(commstr, 0x0, max + 1);
	
	memcpy(commstr, start, max);
	commstr[max] = '\0';

	return commstr;
}


void testcommonStr(void){
	char * str1 = "aocdfe";
	char * str2 = "pmcdfa";
	char * commstr = NULL;

	printf("\n************  testcommonStr ************ \n");

	commstr = commonStr(str1, str2);
	printf("The common str is %s\n", commstr);

	free(commstr);
	commstr = NULL;

	return;
}

代码编译

gcc main.c str.c -g -o a.exe

调试输出

************  testcommonStr ************
The common str is cdf

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值