BF算法(简单匹配法,穷举思路)
int match(SString S,SString T){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(s.ch[i]==t.ch[i]){i++;j++}//主串和字串以此匹配下一个字符
else {i=i-j+2;j=1;} //主串字串指针回溯重新开始下一次匹配
}
if(j>=T.length) return i-T.length; // 返回匹配的第一个字符的下标
else return 0; // 模式匹配不成功
}
比较总次数:(n-m+1)*m
m<<n时,算法的复杂度 O(n*m)
KMP算法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//制作对照前缀表
void prefixTable(char pattern[],int prefix[],int n){ //传入参数:要比较的字符串,制作的前缀表,字符串个数
frefix[0]=0;
int len=0;
int i=1;
while(i<n){
if(pattern[i]==pattern[len]){
len++;
prefix[i]=len;
i++;
}else{
if(len>0){
len=prefix[len-1];
}else{
prefix[i]=len;
i++;
}
}
}
}
//向后移一位
void move_prefixTable(int prefix[],int,n){
int i;
for(i=n-1;i>0;i--){
prefix[i]=prefix[i-1];
}
prefix[0]=-1;
}
//kmb算法搜索
void kmb_search(char text[],char pattern[]){
int n=strlen(pattern);
int m=strlen(text);
int*prefix=malloc(sizeof(int)*n);
int i=0,j=0;
prefixTable(pattern,prefix,n);
mpve_prefixTable(prefix,n);
while(i<m){
if(j==n-1&&text[i]==pattern[j]){
printf("Found pattern at %d\n",i-j); //打印出匹配的字符串的第一个字符的下标
j=prefix[j];
}
if(text[i]==pattern[j]){
i++;j++;
}else{
j=prefix[j];
if(j==-1){ i++;j++}
}
}
//主函数
int main(){
char pattern[]="ABABCABAA"
char text[]="ABABABCABAAB"
kmp_search(textpattren);
return 0;
}