?? 最長公共子串.txt
字號:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
//最長公共子串
//將公共子串問題轉化過來,會有問題,比如stra串:aaaba, strb串:bba,strb[2]的a對應的是stra[]的哪個a呢?
#define NMAX 1200
#define CMAX 300
#define MIN -30000
int shuru[NMAX];
int ans[NMAX];
char stra[NMAX];
char strb[NMAX];
typedef struct link
{
int where;
link *next;
}link;
link* zimu[CMAX];
link* temp[CMAX];
link* tt;
int count[NMAX];//每種字符出現的個數
void print_t(int num)
{
int i,j;
for(i=0;i<CMAX;i++) temp[i]=zimu[i];
for(i=0;i<num;i++)
{
j=stra[i]+1;
{
printf("%d ",temp[j]->where);
temp[j]=temp[j]->next;
}
}
printf("\n");
}
int trans(int num,int xnum)
{
int i,j,k;
for(i=0;i<CMAX;i++)
{
count[i]=0;
zimu[i]=(link *)malloc(sizeof(zimu[1]));
zimu[i]->next=NULL;
zimu[i]->where=-1;
temp[i]=zimu[i];
}
for(i=0;i<num;i++)
{
j=stra[i]+1;
tt=(link *)malloc(sizeof(zimu[1]));
tt->next=NULL;
tt->where=-1;
temp[j]->next=tt;
temp[j]->where=i;
count[stra[i]+1]++;
}
for(i=0;i<CMAX;i++) temp[i]=zimu[i];
for(i=0,k=0;i<xnum;i++)
{
j=strb[i]+1;
if(temp[j]->next!=NULL)
{
shuru[++k]=temp[j]->where;
printf("%d ",temp[j]->where);
temp[j]=temp[j]->next;
}
// else printf("-1 ");
}
printf("\n");
return k;
}
int find(int key,int len)
{
int low,high,mid,max=ans[0];
low=1;high=len;mid=(low+high)/2;
while(low<=high)
{
if(key<ans[mid]) high=mid-1;
else
{
max=mid;
low=mid+1;
}
mid=(low+high)/2;
}
if(max==ans[0]) return 0;
else return max;
}
int solve(int num)
{
int i,len=1,j;
if(num==0) return 0;
ans[0]=MIN;
ans[1]=shuru[1];
for(i=2;i<=num;i++)
{
if(shuru[i]>=ans[len]) ans[++len]=shuru[i];
else
{
j=find(shuru[i],len);
ans[j+1]=shuru[i];
}
}
return len;
}
void print(int len)
{
int i;
printf("len=%d\n",len);
for(i=1;i<=len;i++) printf("%d ",ans[i]);
printf("\n");
}
int main()
{
int alen,blen,knum,len;
while(scanf("%s %s",&stra,&strb)!=EOF)
{
alen=strlen(stra);
blen=strlen(strb);
knum=trans(alen,blen);
printf("%d\n",solve(knum));
}
// print(len);
// print_t(slen);
// int i,num,len;
// scanf("%d",&num);
// for(i=1;i<=num;i++) scanf("%d",&shuru[i]);
// len=solve(num);
// print(len);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -