zoukankan      html  css  js  c++  java
  • BF-KMP 算法

      1 #define _CRT_SECURE_NO_WARNINGS
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<string.h>
      5 
      6 #define MAX_SIZE 255    //    定义字符串的最大长度
      7 
      8 typedef unsigned char SString[MAX_SIZE];    //数组第一个保存长度
      9 //BF
     10 int BFMatch(char *s,char *p)
     11 {
     12     int i,j;
     13     i=0;
     14     while(i < strlen(s))
     15     {
     16         j=0;
     17         while(s[i]==p[j]&&j < strlen(p))
     18         {
     19             i++;
     20             j++;
     21         }
     22         if(j==strlen(p))
     23             return i-strlen(p);
     24         i=i-j+1;                //指针i回溯
     25     }
     26     return -1;    
     27 }
     28 //getNetx
     29 void getNext(char *p,int *next)
     30 {
     31     int j,k;
     32     next[0]=-1;
     33     j=0;
     34     k=-1;
     35     while(j < strlen(p)-1)
     36     {
     37         if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
     38         {
     39             j++;
     40             k++;
     41             next[j]=k;
     42         }
     43         else 
     44         {                  //p[j]!=p[k]
     45             k=next[k];
     46         }
     47     }
     48 }
     49 
     50 //KMP
     51 int KMPMatch(char *s,char *p)
     52 {
     53     int next[100];
     54     int i,j;
     55     i=0;
     56     j=0;
     57     getNext(p,next);
     58     while(i < strlen(s))
     59     {
     60         if(j==-1||s[i]==p[j])
     61         {
     62             i++;
     63             j++;
     64         }
     65         else
     66         {
     67             j=next[j];       //消除了指针i的回溯
     68         }
     69         if(j==strlen(p))
     70         {
     71             return i-strlen(p);
     72         }
     73     }
     74     return -1;
     75 }
     76 
     77 int main()
     78 {
     79     int a, b;
     80     char s[MAX_SIZE], p[MAX_SIZE];
     81 
     82     printf("请输入模式串:");
     83     scanf("%s", &s);
     84     printf("请输入子串:");
     85     scanf("%s", &p);
     86 
     87     a = BFMatch(s, p);
     88     b = KMPMatch(s, p);
     89 
     90     if(a != -1)
     91     {
     92         printf("使用BF算法:%d
    ", a);
     93     }
     94     else
     95     {
     96         printf("未匹配
    ");
     97     }
     98 
     99     if(b != -1)
    100     {
    101         printf("使用KMP算法:%d
    ", a);
    102     }
    103     else
    104     {
    105         printf("未匹配
    ");
    106     }
    107 
    108     system("pause");
    109 }
    请输入模式串:lalalalalaaaa
    请输入子串:lalaa
    使用BF算法:6
    使用KMP算法:6
    请按任意键继续. . .
  • 相关阅读:
    枚举类型
    [ Java学习 ] “goto语句“ 和 “continue + 标号” 的不同待遇
    [ Java学习 ] 其他知识总结(重要)
    [ Java学习 ] Java变量以及内存分配(非常重要)
    [ Java学习 ] 包语句 package等语句的汇总整理
    [ Java学习 ] 破除思维定势之 C++ 和 Java 的差异 003
    P1601一道高精度的题
    啊哈,我又来了
    算了,有一道水题
    再水一道题
  • 原文地址:https://www.cnblogs.com/zhangtingkuo/p/3441254.html
Copyright © 2011-2022 走看看