//对于两个字符串A和B,如果A = "aocdfe",B = "pmcdfa",则输出"cdf"
const char* findStr(const char* src, const char* sub)
{
const char* bp;
const char* sp;
if (src == NULL || sub == NULL) return NULL;
while (*src != '\0') //遍历src字符串
{
bp = src; //用于src的遍历
sp = sub; //用于sub的遍历
do
{
if (!*sp) //如果到了sub字符串结束符位置
return src; //表示找到了sub字符串,退出
} while (*bp++ == *sp++);
src += 1;
}
return NULL;
}
char *commonString(char* str1, char* str2)
{
int i, j;
char *shortStr, *longStr;
char *subStr;
if (str1 == NULL || str2 == NULL) return NULL;
if (strlen(str1) <= strlen(str2))
{
longStr = str2;
shortStr = str1;
}
else
{
longStr = str1;
shortStr = str2;
}
if (findStr(longStr, shortStr) != NULL) return shortStr;
subStr = (char*)malloc(sizeof(char)* (strlen(shortStr) + 1));
for (i = strlen(shortStr) - 1; i > 0; i--) //subStr 长度逐渐减小
{
for (j = 0; j <= strlen(shortStr) - i; j++)
{
memcpy(subStr,&shortStr[j],i); //将短字符串的一部分复制到subStr
subStr[i] = '\0';
if (findStr(longStr, subStr) != NULL) //所以第一个找到的就是最大子串
return subStr;
}
}
return NULL;
}
int main()
{
char str[100] = "123467dfsdf";
char str1[100] = "12345678dfsdfsdf";
cout << commonString(str, str1) << endl;
//注意释放内存 这里只注重逻辑 释放内存可以在优化
system("pause");
return 0;
}
C函数查找两个字符串的最大公共子串
最新推荐文章于 2021-05-24 11:22:40 发布