zoukankan      html  css  js  c++  java
  • KMP

    模板

     1 int Next[MAXN];
     2 char s1[MAXN],s2[MAXN];
     3 
     4 void getNext(char *s){
     5     int l = strlen(s);
     6     Next[0] = -1;//很关键,漏了会死循环.
     7     int k=-1,j=0;
     8     while(j<l){
     9         if(k==-1 || s[k] == s[j]){
    10             j++;
    11             k++;
    12             //Next[j] = k;//这句是未优化时写的代码
    13             if(s[j] != s[k])//如果是k=-1的话,直接赋值为-1,这样优化可以降低一些复杂度
    14                 Next[j] = k;
    15             else
    16                 Next[j] = Next[k];
    17         }
    18         else{
    19             k=Next[k];
    20         }
    21     }
    22 }
    23 
    24 int kmp(char *s1,char *s2){
    25     getNext(s2);//注意,求next数组是求匹配串的
    26     int l1=strlen(s1);
    27     int l2=strlen(s2);
    28     int i=0;
    29     int j=0;
    30     while(i<l1&&j<l2){//随机应变,例如求匹配串有多少个,此处的j<l2去掉即可
    31         if(j==-1||s1[i] == s2[j]){//找到匹配各自加1
    32             i++;
    33             j++;
    34         }
    35         else{//kmp的精髓,自己好好体悟
    36             j=Next[j];
    37         }
    38     }
    39     if(j==l2){
    40         return i-j;//找到匹配串,返回第一个匹配的位置
    41     }
    42     else return -1;
    43 }
    int Next[MAXN];
    char s1[MAXN],s2[MAXN];
     
    voidgetNext(char*s){
        int l =strlen(s);
        Next[0]=-1;//很关键,漏了会死循环.
        int k=-1,j=0;
        while(j<l){
            if(k==-1|| s[k]== s[j]){
                j++;
                k++;
                //Next[j] = k;//这句是未优化时写的代码
                if(s[j]!= s[k])//如果是k=-1的话,直接赋值为-1,这样优化可以降低一些复杂度
                    Next[j]= k;
                else
                    Next[j]= Next[k];
            }
            else{
                k=Next[k];
            }
        }
    }
     
    intkmp(char*s1,char*s2){
        getNext(s2);//注意,next数组是求匹配串的
        int l1=strlen(s1);
        int l2=strlen(s2);
        int i=0;
        int j=0;
        while(i<l1&&j<l2){//随机应变,例如求匹配串有多少个,此处的j<l2去掉即可
            if(j==-1||s1[i]== s2[j]){//找到匹配各自加1
                i++;
                j++;
            }
            else{//kmp的精髓,自己好好体悟
                j=Next[j];
            }
        }
        if(j==l2){
            return i-j;//找到匹配串,返回第一个匹配的位置
        }
        elsereturn-1;
    }
  • 相关阅读:
    zabbix客户端自动注册
    运维监控篇(2)_Zabbix简单的性能调优
    Zabbix unreachable poller processes more than 75% busy
    RabbitMQ 内存控制 硬盘控制
    RabbitMQ的Q&A
    RabbitMQ性能优化
    消息默认的属性
    RabbitMQ的Vhost,Exchange,Queue原理分析
    逻辑运算符(&& || and or)
    面向对象
  • 原文地址:https://www.cnblogs.com/yZiii/p/7284652.html
Copyright © 2011-2022 走看看