#include<iostream>
using namespace std;
const int MaxNum = 100;
struct SeqString
{
int length;
char c[MaxNum];
};
typedef struct SeqString* PSeqString;
PSeqString creatString();
void find(PSeqString t, PSeqString p);
int KMPmatch(PSeqString t, PSeqString p2, int* next);
void makenext(PSeqString p, int* next);
void display(PSeqString pstr);
int main()
{
PSeqString p = new SeqString;
p = creatString();
PSeqString t = new SeqString;
t = creatString();
find(p, t);
cin.get(); cin.get();
}
PSeqString creatString()
{
PSeqString pstr = new SeqString;
cout << "输入其中一个字符串:\n";
cin >> pstr->c;
pstr->length = strlen(pstr->c);
return pstr;
}
void find(PSeqString t, PSeqString p)
{
PSeqString temp = new SeqString;
if (t->length < p->length)
{
temp = t;
t = p;
p = temp;
}
int* next = new int[MaxNum];
int len = 0, maxlen = 0, loc = 0;
PSeqString p2 = new SeqString;
int i, k, l;
for (int i = 0; i < p->length; i++)
{
for (len = p->length - i; len > 0; len--)
{
p2->length = len;
for (k = 0, l = i; k < len; k++, l++)
{
p2->c[k] = p->c[l];
}
makenext(p2, next);
if (KMPmatch(t, p2, next) && len > maxlen)
{
maxlen = len;
loc = i;
}
}
}
p2->length = maxlen;
for (k = 0, l = loc; k < maxlen; k++, l++)
{
p2->c[k] = p->c[l];
}
cout << "最长的公共子串为: ";
display(p2);
delete(p2);
delete(temp);
}
int KMPmatch(PSeqString t, PSeqString p2, int* next)
{
int i = 0, j = 0;
while (i < p2->length&&j < t->length)
{
if (i == -1 || p2->c[i] == t->c[j])
{
i++, j++;
}
else
i = next[i];
}
if (i >= p2->length)
return 1;
else
return 0;
}
void makenext(PSeqString p, int* next)
{
int i = 0, k = -1;
next[0] = -1;
while (i < p->length - 1)
{
while (k >= 0 && p->c[i] != p->c[k])
k = next[k];
i++, k++;
if (p->c[i] == p->c[k])
next[i] = next[k];
else
next[i] = k;
}
}
void display(PSeqString pstr)
{
for (int i = 0; i < pstr->length; i++)
{
cout << pstr->c[i];
}
}
