#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
/*不太合理的地方时返回堆内存 防止内存泄露的任务交给了函数调用者*/
char* GetSameSubstr(const char* s1,const char* s2)
{
int len1=strlen(s1);
int len2=strlen(s2);
int cnt=0;
int maxlen=0;
int maxpos=0;
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
if(s2[j]==s1[i])
{
cnt=1;
int index1=i; //记录相同字串的其实地址
int index2=j; //记录相同字串的其实地址
while(index1+1<len1 /*&& index2+1<len2 */&& s1[++index1]==s2[++index2])
cnt++;
if(cnt>maxlen)
{
maxlen=cnt; //保存最大长度
maxpos=i; // 记录最大长度的起始地址
}
}
}
}
char* address=new char[maxlen+1];
strncpy(address,s1+maxpos,maxlen);
address[maxlen]='\0';
return address;
}
char *commonstring(char *str1, char *str2)
{
int i, j;
char *shortstr, *longstr;
char *substr;
if (NULL == str1||NULL == str2)
return NULL;
/*判断两个字符串的长短*/
if (strlen(str1) <= strlen(str2))
{
longstr = str2;
shortstr = str1;
}
else
{
shortstr = str2;
longstr = str1;
}
/*算法思想:先从长串里边查找短串*/
if (strstr(longstr, shortstr) != NULL)//如果没找到则返回NULL
return shortstr;
substr = (char *)malloc(sizeof (char)*(strlen(shortstr)+1));
for (i = strlen(shortstr)-1; i > 0; i--)
{
//从shortstr中按子串从长到短与longstr比较是否有公共子串,找到则返回
for (j = 0; j <= strlen(shortstr)-i; j++)
{
/*算法思想:先从长串里边查找短串,循环外边已经判断了长串里边
不包含短串,所以短串长度减一,扫描长串里边是不是包含长度减一的短串
并且长度减一后的短串也在扫描 此处可以使用KMP算法提高效率*/
memcpy(substr, &shortstr[j], i);
//从shortstr[j]位置开始复制i字节给substr,memcpy头文件string.h
substr[i] = '\0';
if (strstr(longstr, substr) != NULL)//如果没找到则返回NULL
return substr;
}
}
return NULL;
}
void test3()
{
char *str2 = (char *)malloc(256);
char *str1 = (char *)malloc(256);
char *common = NULL;
gets(str1);
gets(str2);
common = commonstring(str1, str2);
printf("the longest common string is %s\n", common);
if(common!=str1&&common!=str2)
free(common);
}
void test1()
{
char str1[]="abc12abc123";
char str2[]="abc123";
char* tmp=GetSameSubstr(str1,str2);
cout<<tmp<<endl;
delete[] tmp;
}
int main()
{
test3();
test1();
return 0;
}
找出两个字符串的最大公共子串
最新推荐文章于 2022-10-26 23:20:58 发布