字符串   abcd abc abcd abc

匹配串   cdabcd

匹配串的 next  0 0 0 0 1 2;

开始匹配

abcd abc abcd abc

cd abc d

a,d 匹配失败

next 数组进行移动

abcd abc abcd abcd

c dabcd

再次匹配

模板

这个算法有些问题(尚未找到修改方法)

#include<bits/stdc++.h>
using namespace std;
;
];
//  next 数组首位为  0
int KMP(string ss,string tt)
{
    nt[]=;
    ,k=;p<tt.size();p++)
    {
         && tt[k]!=tt[p])
            k=tt[k-];
        if(tt[k]==tt[p])
            k++;
        nt[p]=k;
    }  // 构建 next 数组
    ,k=;p<ss.size();p++)
    {
        && ss[p]!=tt[k])
            k=tt[k-];
        if(ss[p]==tt[k])
            k++;
        if(k==tt.size())
        {
            cout<<<<"   "<<p<<endl;
            ;
        }
    }
    ;
}
int main()
{
    string ss,tt;
    cin>>ss>>tt;
    cout<<KMP(ss,tt)<<endl;
}

next[0]=-1;

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
];
];
];
int KMP()
{
    int s=strlen(ss);  // ss
    int t=strlen(tt);
    nt[]=-;
    ;
    ,j=-;i<s;)
    {
        ||ss[i]==ss[j])
        {
            i++; j++;
            nt[i]=j; // next[1]=0;
        }
        else
            j=nt[j];
    }
    //for(int i=0;i<s;i++)
    //cout<<nt[i]<<endl;
    ,j=;i<t;)
    {
        ||ss[j]==tt[i])
        {
            i++; j++;
        }
        else j=nt[j];
        if(j==s)
        {
            num++;
            j=;
        }

    }
    return num;

}
int main()
{

    ]!='#')
    {
        scanf("%s",ss);
        cout<<KMP()<<endl;
    }
}

KMP算法自我理解 和 模板的更多相关文章

  1. 自己对kmp算法的理解,借由 28. 实现 strStr() 为例

    做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...

  2. KMP算法,匹配字符串模板(返回下标)

    //KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...

  3. KMP算法 --- 深入理解next数组

    在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...

  4. KMP算法的理解

    ---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法 ...

  5. 关于《数据结构》课本KMP算法的理解

    数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...

  6. 关于KMP算法的理解

    上次因为haipz组织的比赛中有道题必须用到KMP算法,因此赛后便了解了下它,在仔细拜读了孤~影神牛的文章之后有种茅塞顿开的感觉,再次ORZ. 附上链接http://www.cnblogs.com/y ...

  7. 我对KMP算法的理解

    KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...

  8. AC自动机自我理解和模板

    给出长度为m的文本 查询 n个单词出现的次数 用kmp 复杂度 n*m*(单词平均长度) 用字典树 复杂度 m*每次字典树遍历的平均深度) AC自动机 复杂度 m (思路可以理解为kmp+字典树 ) ...

  9. 第十一章 串 (c3)KMP算法:理解next[]表

随机推荐

  1. Cyclic Components CodeForces - 977E(DFS)

    Cyclic Components CodeForces - 977E You are given an undirected graph consisting of nn vertices and  ...

  2. spoj1811

    题解: 后缀自动机 先把A的后缀自动机建好 然后用B再上面跑 如果不能转移就跳fail 如果可以就到下一个可行状态 代码: #include<bits/stdc++.h> using na ...

  3. 【原创】QT 打印输出

    list类 qDebug 的两种用法 #include <QDebug> int main(int argc,char *argv[]) { QList<int> list; ...

  4. python ----字符串基础练习题30道

    1.执行python脚本的两种方式 一种是点开始--运行--cmd 方式(这个操作需要先配置好环境变量path路径)之后运行python 二是直接进安装目录 运行tython软件运行.pycharm ...

  5. JVM运行时内存区域

    JVM运行java程序时会将内存划分为若干个不同的数据区域: (1)程序计数器: 1.占用内存空间不大. 2.程序计数器相当于JVM所执行的字节码(jvm指令)的“行号指示器”,通过程序计数器的“值” ...

  6. Linux学习 :移植U-boot_2012.04.01到JZ2440开发板

    一.下载U-boot源码:ftp://ftp.denx.de/pub/u-boot/ 二.uboot的启动过程: 部分硬件初始化——>加载完整uboot到RAM——>跳转到第二阶段入口开始 ...

  7. DevExpress v18.1新版亮点——Report & Dashboard Server

    用户界面套包DevExpress v18.1日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Report Server v18.1 的新功能,快来下载试用新 ...

  8. 201621123001 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 一个进程可以同时运行多个不同线程,不同的线程执行不同的任务 Java线程是通过java.lang包中定义的Thre ...

  9. python-django优缺点

    [Django]是利用[Python]语言从事[Web]开发的首选框架.如果你以后想从事[python web]开发工作,就必需了解其优缺点.这些都可能会是你将来的面试题哦. [Django]的优点 ...

  10. python 时间格式化

    2018-10-25 17:49:51 监控软件 原始 2018-10-2517:49:51 切割后 2018/10/25 17:49:51 格式化后 shijian = ' '.join(respo ...