问题遇到的现象和发生背景
求最长子序列,怎么输入都是输出最短的那个,或是一个拼接答案,该怎么改?
问题相关代码,请勿粘贴截图
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define MAX 64
typedef struct node{
char data[MAX];
int length;
}SqString;
void StrAssign(SqString *s,char cstr[])
{
int i;
for (i=0;cstr[i]!='\0';i++)
s->data[i]=cstr[i];
s->data[i]='\0';
s->length=i;
}
SqString* SubStr(SqString *s,int i,int j)
{
SqString* str;
int k;
str->length=0;
if (i<0 || i>s->length || j<0 || i+j-1>s->length)
return str; //参数不正确时返回空串
for (k=i;k<i+j-1;k++) //s->data[i..i+j]?str
str->data[k-i]=s->data[k];
str->length=j-1;
return str;
}
bool SubContains(SqString* s1,SqString* temp)
{
int i = 0, j = 0, flag = -1;
while (i < s1->length && j < temp->length)
{
if (s1->data[i] == temp->data[j])
{
i++;
j++;
}
else
{
i = i - j + 1; //主串字符回到比较最开始比较的后一个字符
j = 0; //字串字符重新开始
}
if (j == temp->length)
{ //如果匹配成功
flag = 1; //字串出现
break;
}
}
return flag;
}
SqString* MaxSubstring(SqString* s1,SqString* s2){
SqString* max,*min;
max=(s1->length>s2->length)?s1:s2;
min=(max==s1)?s2:s1;
for(int i=0;i<min->length;i++)
{
for(int j=0,k=min->length-i;k!=min->length+1;j++,k++)
{
SqString* temp=SubStr(min,j,k-j-1);
if(SubContains(max,temp))
return temp;
}
}
return 0;
}
int main(){
char a1[100],a2[100];
SqString* s,s1,s2;
printf("请输入第一个字符串:");
gets(a1);
printf("请输入第二个字符串:");
gets(a2);
StrAssign(&s1,a1);
StrAssign(&s2,a2);
s=MaxSubstring(&s1,&s2);
printf("%s",s->data);
return 0;
}