趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~
描述:
给你一串字符串,请你找到前缀和后缀最大重叠部分
思路:
其实就是KMP,先计算出来pi函数,然后通过pi函数进行跳转,输出匹配的部分。
代码:
#include<stdio.h>
#include<string.h>
#define maxsize 1000000
int pi[maxsize];
char a[maxsize];
void pi_fun(int l){//pi可以回溯真的重叠部分
int i=0,j=-1;
pi[0]=-1;
while(i<l-1){
if(a[i+1]==a[j+1]){
i++;
j++;
pi[i]=j;
}
else if(j==-1){
i++;
pi[i]=j;
}
else{
j=pi[j];
}
}
}
int main(){
gets(a);
int s=strlen(a);
pi_fun(s);
int i,j,t,e;
for(i=0;i<s;i++){
j=i;
e=0;
while(j!=-1&&e<10){
printf("%d ",j+1);//先出出i,因为pi是真重叠部分
e++;
j=pi[j];
}
printf("\n");
}
return 0;
}
从这个例子中找到PI函数的意义