求一個字串的字首與另一個字串的字尾的最大相同子串
阿新 • • 發佈:2019-01-08
求字串ptr的字首與str的字尾的最大相同子串,若不存在,輸出0。
樣例輸入
mike
aniom
kiava
dvakia
dasds
fdsgh
樣例輸出
m 1
kia 3
0
分析:
先求字串ptr的next陣列,然後使用KMP演算法求ptr的字首與str字尾的最大相同子串
#include<cstdio> #include<cstring> using namespace std; const int maxn=1e5+10; void cal_next(char* str,int* next,int len) { next[0]=next[1]=0; for(int i=1;i<len;++i) { int j=next[i]; while(j&&str[i]!=str[j]) j=next[j]; next[i+1]=(str[j]==str[i])?j+1:0; } } int kmp(char *str,int slen,char *ptr,int plen) { //int *next=new int[plen]; int next[maxn]; cal_next(ptr,next,plen); /* for(int i=0;i<plen;i++) printf("%d ",next[i]); printf("\n"); */ int j=0; for(int i=0;i<slen;i++) { while(j&&ptr[j]!=str[i]) j=next[j]; if(ptr[j]==str[i]) ++j; } //printf("j:%d\n",j); return j; } char str[maxn],ptr[maxn],ans[maxn]; int main() { while(scanf("%s%s",ptr,str)!=EOF){ int plen=strlen(ptr),slen=strlen(str); int len=kmp(str,slen,ptr,plen); //printf("len:%d\n",len); if(len==0) printf("0\n"); else{ memset(ans,0,sizeof(ans)); memcpy(ans,ptr,len*sizeof (char)); printf("%s %d\n",ans,len); } } return 0; }