问题描述:给定一个文本,在该文本中查找并定位任意给定字符串:给定两个串和
,在主串S中查找子串T的过程,T为模式。
1、bf算法
蛮力法
对主串与模式串一个一个进行比较,若不匹配,则模式串从第一个字符开始,主串往后一个字符,再进行下一趟比较;若匹配,则模式串与主串字符往后进行比较。
直到主串s所剩字符长度小于模式串t长度或模式串所有字符比较完毕。
#include<stdio.h>
#include<string.h>
int BF(char s[],char t[]){
int n,m,f,i,j;
n=strlen(s);
m=strlen(t);
for(i=0;i<=n-m;i++){
f=i;
for(j=0;j<m;j++){
if(s[f]==t[j])f++;
else break;
}
if(j==m)return f-m+1;
}
return 0;
}
int main(){
char s[1000],t[100];
int k;
printf("BF算法:\n");
while(1){
gets(s);
gets(t);
k=BF(s,t);
if(k)printf("在主串中第%d个位置找到子串匹配\n",k);
else printf("查找失败\n");
}
return 0;
}
/*
hjyuytfghd
uyytf
huhgyhyqwwwwqefddfv
qq
ababcabcacbab
abcac
aaaaaaaaaaab
aaaab
abc
abc
*/
2、kmp算法
首先计算模式串的next[],即最大真前缀值(k)加一,定义为:
例如
,
模式
T
=
″
aba