zoukankan      html  css  js  c++  java
  • KMP算法实现目标串与模式串匹配

     1 //KMP算法实现字符串匹配 
     2 //该算法保证字符比较次数不超过目标串字符长度的2倍 
     3 #include <cstdlib>
     4 #include <iostream>
     5 
     6 using namespace std;
     7  
     8  void compute_next(int* next,char const*p,int len){//计算模式串中元素序号j的左侧最大重叠度 
     9       int j=0;
    10       int q=next[0]=-1;
    11       --len;
    12       while(j<len)
    13       if(q==-1||p[q]==p[j])
    14       next[++j]=++q;
    15       else 
    16       q=next[q];
    17       } 
    18 
    19 char const* kmp_find(char const*t,int tlen,char const*p,int plen,int const*next){
    20       int i=-1;
    21       int j=-1;
    22       while((i<tlen)&&(j<plen)){
    23         if((j==-1)||(t[i]==p[j])) {++i;++j;}
    24         else j=next[j];                        
    25                                 }
    26       if(j==plen) return t+i-plen;
    27       else return 0;                               
    28                                       }
    29  
    30 int main()
    31 {   char a[100]="ahgdhjggabcabcabbacll";//用户自编目标串 
    32     char b[12]="abcabcabbac";//用户自编模式串 
    33     char const* t_;
    34     int next[11];//与b串的元素个数相同,不含null 
    35     compute_next(next,b,11);// 与b串的元素个数相同,不含null
    36     
    37     cout<<"target string:"<<endl;
    38     for(int i=0;a[i];i++)
    39      cout<<a[i];
    40       cout<<endl; cout<<endl; 
    41     cout<<"mode string:"<<endl;
    42     for(int i=0;b[i];i++)
    43      cout<<b[i];
    44       cout<<endl;cout<<endl; 
    45      
    46     cout<<"最大重叠度计算为:"<<endl;
    47      for(int i=0;i<11;i++)
    48           cout<<"pi("<<i<<"):"<<next[i]<<endl;
    49       cout<<endl; 
    50           
    51     t_=kmp_find(a,100,b,11,next);
    52    if(!t_)
    53       cout<<"can not find mode string in target string!"<<endl;
    54       else 
    55       cout<<"the position of mode string in target string is:"<<t_-a+1<<endl;
    56     system("PAUSE");
    57     return EXIT_SUCCESS;
    58 }
  • 相关阅读:
    Spring Boot 配置加载顺序详解
    JVM总结篇
    nginx负载均衡的策略
    布隆过滤器的方式解决缓存穿透问题
    Spring Cloud Eureka自我保护机制(服务无法剔除)
    缓存穿透,缓存击穿,缓存雪崩解决方案分析
    高并发秒杀系统总结
    Linux环境进程间通信(一)
    HDU 1695 GCD(容斥定理)
    数据结构精要------冒泡与直接排序算法
  • 原文地址:https://www.cnblogs.com/jieforever/p/4662395.html
Copyright © 2011-2022 走看看