找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
#include <string.h>
void checknext(char *s1, char *s2, int i, int j, int *m); // 声明
void getPublicStr(char *str1, char *str2); // 声明
int main()
{
char *s1 = "nihaoheimahlovetmanb";
char *s2 = "nihaoheimaitgdfgsteia";
getPublicStr(s1,s2);
return 0;
}
void checknext(char *s1, char *s2, int i, int j, int *m)
{
if(s2[i+1]==s1[j+1]&&s2[i+1]!='\0'&&s1[j+1]!='\0')
{
(*m)++; // 通过指针给长度+1
checknext(s1,s2,i+1,j+1,m); //递归查找下一个相同的字符
}
}
void getPublicStr(char *str1, char *str2)
{
int max = 0, start = 0, length=0; // 定义最大长度,开始下标,匹配长度
char *longstring;char *shortstring; // 定义较长字符串和较短字符串
if(strlen(str1)<strlen(str2)) // 将较长字符串赋给longstring,短字符串赋给shortstring
{
longstring = str2; shortstring = str1;
}
else
{
longstring = str1; shortstring = str2;
}
// 遍历
for(int i=0;i<strlen(longstring);i++)
{
for(int j=0;j<strlen(shortstring);j++)
{
//取出shortstring的每一个元素与longstring进行比较
if(longstring[i]==shortstring[j])
{
length=1;
checknext(longstring,shortstring,i,j,&length);// 首次执行完后获得第一个匹配字符串长度
}
if(length>max)
{max=length; start=i;} //如果长度大于最大长度,则保存最大值
}
}
if(max == 0)
{
printf("没有找到最大公共字符串\n");
}
else
{
printf("最大公共字符串是:");
for(int k=start;k<(max+start);k++)
{
printf("%c",longstring[k]); // 循环输出最大公共字符串
}
printf("\n");
}
}
|
|