题目简述:

    给你两个字符串p和s,求出p在s中出现的次数。

思路简述:

    在介绍看BF算法时,终于了解到了大名鼎鼎的KMP算法,结果属于KMP从入门到放弃系列,后来看了几位大神的博客,似乎有点懂了。此题为KMP算法的简单应用。

KMP简述:

    BF算法为穷举法,而此法通过next数组的指引,巧妙的跳过了模式串即短的那串中几个不需要去比较的字符,实现效率的提高。next数组为模式串前后完全重复的最大子串,前串以第一个字母开

    头,后串以所求数值的前一位为结束,重复最大子串中字母数量即next数组相应位置的值。还有一种可以优化的情况,下面的代码没写进去。百度

基础版代码:

#include <iostream>
#include <cmath>
#include<stdio.h>
#include <cstdio>
#include <cstring>
#include<algorithm>
using namespace std;

#define N 100010  

char s[N * 10], p[N];//s为输入长的,p为短的
int nextval[N];
int lens, lenp; void getnext()//根据模式串得出next数组
{
int i = 0, j = -1;
nextval[0] = -1;//next数组最前面为-1
while (i != lenp)//当后搜索符未达到模式串即短的那串的结束
{
if (j == -1 || s[i] == s[j])//前搜索符刚刚开始搜索或前后搜索符对应字母相等时
nextval[++i] = ++j;//进行相应next的赋值
else
j = nextval[j];//前搜索符回到开始或已经得到的相应的next值,后搜索符不变
}
} int KMP()
{
int i = 0, j = 0, count = 0;
while (i != lens && j != lenp)//因为是要得到所有所处的位置
{
if (s[i] == p[j] || j == -1)//前搜索符刚刚开始搜索或前后搜索符对应字母相等时
++i, ++j;
else
j = nextval[j]; //前搜索符回到开始或已经得到的相应的next值,后搜索符不变
if (j == lenp)//当到达短的那串结尾时,说明一次完全匹配完成
{
count++;
j = nextval[j];//把前搜索符转到相应next值处
}
}
return count;
} int main()
{
int ncase;
int len;
int ans;
scanf("%d", &ncase);
while (ncase--)
{
scanf("%s %s", p, s);
lens = strlen(s);
lenp = strlen(p);
getnext();
ans = KMP();
printf("%d\n", ans);
}
return 0;
}

  

简单kmp算法(poj3461)的更多相关文章

  1. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  2. KMP算法简单回顾

    前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...

  3. KMP算法实践与简单分析

    一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...

  4. 运用kmp算法解决的一些问题的简单题解

    学习kmp算法我最后是看的数据结构书上的一本教材学会的..我认为kmp相对于普通的BF算法就是避免了非常多不必要的匹配.而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存 ...

  5. KMP算法的一个简单实现

    今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...

  6. KMP算法 C#实现 字符串查找简单实现

    KMP算法 的C#实现,初级版本 static void Main(string[] args) { #region 随机字符 StringBuilder sb = new StringBuilder ...

  7. Linux GCC下strstr的实现以及一个简单的Kmp算法的接口

    今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: char *strstr(const char*s1,const char*s2) { con ...

  8. KMP 算法简单解释

    ​ 讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 ​ 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...

  9. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

随机推荐

  1. Python随笔--代理ip

  2. 6 python高级数据处理和可视化

    6.2. pyplot作图 1.折线图和散点图 t = np.arange(0,4,0.1) plt.plot(t,t,'o',t,t+2,t,t**2,'o') plt.show() 2.柱线图 p ...

  3. Spark Streaming的容错和数据无丢失机制

    spark是迭代式的内存计算框架,具有很好的高可用性.sparkStreaming作为其模块之一,常被用于进行实时的流式计算.实时的流式处理系统必须是7*24运行的,同时可以从各种各样的系统错误中恢复 ...

  4. Python知识体系思维导图:

    基础知识 数据类型 1.序列 2.字符串 3.列表和元组 4.字典和集合 循环 & 判断

  5. python模块和包(模块、包、发布模块)

    模块和包 目标 模块 包 发布模块 01. 模块 1.1 模块的概念 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块 模块名 同样也 ...

  6. 前端开发【第三篇: JavaScript基础】

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...

  7. yum安装的Nginx添加第三方模块支持tcp

    需求:生产有个接口是通过socket通信.nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. 实现方法:Centos7.2下yum直接安装的nginx, ...

  8. 马凯军201771010116《面向对象与程序设计Java》第十一周学习总结

    一.理论知识部分 第九章  集合 1.数据结构介绍:线性结构:线性表,栈,队列,串,数组,文件.非线性结构:树,图. 散列表:又称为哈希表. 散列表算法的基本思想是:以结点的关键字为自变量,通过一定的 ...

  9. spring cloud 工程构建

    https://blog.csdn.net/zhou199252/article/details/80745151 https://blog.csdn.net/forezp/article/detai ...

  10. Ricker wavelet 简介

    本文依照参考文献简介 Ricker wavelet . 参考: [1] Frequency of the Ricker wavelet DOI: 10.1190/GEO2014-0441.1 [2] ...