思路
分别遍历两个字符串,一个是外循环,一个是内循环,当内、外循环发现有相同的字符的时候,从当前位置开始匹配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