串的模式匹配BF和KMP算法实现

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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nuo__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值