/*作者:Yj*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//字符串的数据结构 顺序表示
struct SeqString{
int MAXNUM;
int n;
char *c;
};
typedef struct SeqString *PSeqString;
//创建一个新的字符串
PSeqString createEmptyStr_seq(int m)
{
PSeqString pstr = (PSeqString)malloc(sizeof(struct SeqString));
if(pstr!=NULL){
pstr->c = (char*)malloc(sizeof(struct SeqString));
if(pstr->c){
pstr->n = 0;
pstr->MAXNUM = m;
return pstr;
}
else free(pstr);
}
printf("Out of space!\n");
return NULL;
}
int index(PSeqString t,PSeqString p)
{
// printf("\n %d %d\n",t->n,p->n);
int i=1,j=1;
while(i<=p->n && j<=t->n)
if(p->c[i] == t->c[j]){
i++;j++;
}
else{
j = j-i+2;
i=1;
}
if(i > p->n)
return 1;
else
return 0;
}
//求一个字串的子串
PSeqString subStr_seq(PSeqString s, int i, int j){
// printf("%d", i);
PSeqString sp;
int k;
sp = createEmptyStr_seq(j);
if(sp == NULL) return NULL;
if(i>0 && i<=s->n && j>0){
if(s->n < i+j-1) j=s->n-i+1;
for(k=1;k<=j;k++)
sp->c[k] = s->c[i+k-1];
sp->n = j;
}
return sp;
}
int main(){
int i=0, j=0, MAX=0;
int a=0,b=0;
PSeqString s1, s2, s, sM;
printf("please input the String length:\n");
scanf("%d", &a);
scanf("%d", &b);
s1 = createEmptyStr_seq(a);
s2 = createEmptyStr_seq(b);
sM = createEmptyStr_seq(a+b);
printf("please input s1:");
for(i=0;i<=a;i++){
scanf("%c",&s1->c[i]);
}
s1->n = a;
printf("please input s2:");
for(j=0;j<=b;j++){
scanf("%c",&s2->c[j]);
}
s2->n = b;
//最朴素的思路,直接把s1当中所有的不包括空字串的子集拿出来和s2作比较,记录最长的那个
for(i=1;i<=a;i++){
for(j=i;j<=a;j++){
s = createEmptyStr_seq(j-i+1);
s = subStr_seq(s1,i,j-i+1);
if(s2->n >= s->n){
if(index(s2,s) != 0 && MAX <= j-i+1){
MAX = j-i+1;
sM = s;}
}
else
// printf("%d\n",index(s,s2));
{
if(index(s,s2) != 0){
MAX = s2->n;
sM = s2;}
}
// if(index(s2,s)!=0 && MAX <= j-i+1)
// MAX = j-i;
}
}
// if(MAX != 0){
// s =
// }
// printf("%d\n",MAX);
for(i=1;i<=MAX;i++){
printf("%c", sM->c[i]);
}
return 0;
}
效果如下:
本算法上机即可运行,但是有许许多多值得优化的地方
下面列出几处需要优化的地方:
(1)可以KMP算法来代替朴素对比的算法;并比较运行时间
(2)比较的方式也可以做改变,并不需要全部比较,可以引入一些思想改变对比方式。