• KMP


     

     KMP:(1) 求 字符串前缀 与 后缀 匹配的字符数

                 (2) next[0] = 0, next[1] = 0; 把求出的长度后移一位

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e5 + 7;
     4 char p[maxn], s[maxn];
     5 int n,m;
     6 int Nextnum[maxn];
     7 void GetFail(char p[], int plen)
     8 {
     9     Nextnum[0] = 0, Nextnum[1] = 0;
    10     for(int i = 1; i < plen; i++)  //模式串求 next[]
    11     {
    12         int j = Nextnum[i]; //返回上一次匹配结束时 j 指针的位置
    13         while(j && p[i] != p[j]) j = Nextnum[j];  //匹配失效,模式串右移 j - next[j]位
    14         Nextnum[i+1] = (p[i] == p[j]) ? j+1 : 0;  //前后缀匹配成功 next[i+1] = ++j; 否则 next[i+1] = 0;
    15     }
    16 }
    17 void Kmp(char s[],char p[])
    18 {
    19     int last = -1;  //记录位置用
    20     int slen = strlen(s), plen = strlen(p);
    21     GetFail(p,plen);  //求next[]
    22     for(int j = 0, i = 0; i < slen; i++)
    23     {
    24         while(j && s[i] != p[j]) j = Nextnum[j];  //匹配失效,模式串右移 j - next[j] 位
    25         if(s[i] == p[j]) j++;  //匹配成功,继续匹配
    26         if(j == plen)  //完全匹配
    27         {   //匹配后的题目逻辑
    28             printf("%d ", i+1-plen);  //输出在主串的起始位置
    29         }
    30     }
    31 }
    32 int main()
    33 {
    34     cin>>n>>p>>m>>s;
    35     Kmp(s,p);
    36     return 0;
    37 }
  • 相关阅读:
    PL/SQL跨库查询数据
    oracle 两个时间相减
    导出Excel格式数据
    Java导出pdf文件数据
    $.ajax相关用法
    oracle 删除掉重复数据只保留一条
    常用Oracle操作语句
    JS请求服务器,并返回信息,请求过程中不需要跳转页面
    tomcat部署web项目的3中方法
    Date()日期转换和简单计算
  • 原文地址:https://www.cnblogs.com/Edviv/p/11708519.html
Copyright © 2020-2023  润新知