求取出现的次数 : 

#include<bits/stdc++.h>
const int maxn = 1e6 + 10;
char mo[maxn], str[maxn];///mo为模式串、str为主串
int next[maxn];
inline void GetNext()
{int i = 0, j = -1, len = strlen(mo);next[i] = j;while(i < len){
//        if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;
//        else j = next[j];while( j != -1 && mo[i] != mo[j]) j = next[j];next[++i] = ++j;}
}
int KmpCount()///计算模式串在子串出现的次数
{GetNext();int i = 0, j = 0, strL = strlen(str), moL = strlen(mo);int ans = 0;while(i < strL){while( j != -1 && mo[j] != str[i]) j = next[j];i++, j++;if(j == moL) ans++;}return ans;///返回模式串在主串中出现的次数(可重叠出现)
}
int main(void)
{scanf("%s %s", str, mo);printf("%d\n", KmpCount());return 0;
}

View Code

求模式串第一次在主串出现的位置 or 匹配是否在主串出现过 :

#include<bits/stdc++.h>
const int maxn = 1e6 + 10;
char mo[maxn], str[maxn];///mo为模式串、str为主串
int next[maxn];
inline void GetNext()
{int i = 0, j = -1, len = strlen(mo);next[i] = j;while(i < len){while( j != -1 && mo[i] != mo[j]) j = next[j];next[++i] = ++j;}
}
int KmpIndex()
{GetNext();int i =0, j = 0, strL = strlen(str), moL = strlen(mo);while(i < strL && j < moL){while( j != -1 && str[i] != mo[j]) j = next[j];i++, j++;}if(j == moL) return i - moL;///返回模式串在主串中首次出现的位置else return -1;
}
int main(void)
{scanf("%s %s", str, mo);printf("%d\n", KmpIndex());return 0;
}

View Code

///--------------------------------------------------------------------------------------------------------------------------

KMP算法的解释尤其是next数组可以参考这个博客 : http://blog.csdn.net/yutianzuijin/article/details/11954939/

这个是我对KMP的next数组的一点理解,都写在注释里面了

#include<bits/stdc++.h>
const int maxn = 1e6 + 10;
char mo[maxn], str[maxn];///分别为模式串和子串
int next[maxn];
/// next[i] 可以"翻译"成 i 这里失配了,考虑 0~(i-1) 这个
/// 串,看能否找到一个位置 k 和 k' 使得前缀 0~k 和后缀
/// k'~(i-1)一样,而next[i]存储的就是 k+1 这个位置,即
/// 前缀的前一个
inline void GetNext()
{int i = 0, j = -1, len = strlen(mo);next[i] = j;while(i < len){while( j != -1 && mo[i] != mo[j]) j = next[j];next[++i] = ++j;}
}
///-------------------------------------------------------------
///可以用下面的图来动态演示一下GetNext()的步骤,可能就能够理解
//                  i
//- 0 1 2 3 4 5 6 7 8
//  a b c a b c a d x
//  - 0 0 0 1 2 3 4 0
//                  a b c a b c a d x
//                  - 0 0 0 1 2 3 4 0
//                  j
///下面有几句话可能能帮助理解
///①找next的值相当于就是拿模式串自己和自己匹配,在下面移动的就是后缀,在上面的就是前缀
///②当前匹配的字符以及其前面的字符的next值肯定是已经求出来的
///③当j==-1的时候就说明现在的i连模式串的第一个都不能匹配到
///④如果是判断当前的 i 和 j 则说明是在为 i+1 这个字符寻找 0~i (即i+1后的字符串)是否拥有相同前后缀
///--------------------------------------------------------------
int KmpCount()
{GetNext();int i = 0, j = 0, strL = strlen(str), moL = strlen(mo);int ans = 0;while(i < strL){while( j != -1 && mo[j] != str[i]) j = next[j];///匹配的时候当 j == -1 的时候就已经是第i++, j++;                                      ///一个现在的主串 i 连模式串的第一个都不if(j == moL) ans++;                            ///能匹配,所以下面让 i++,因为 j == -1,}                                                  ///所以 j++ 后自然是子串第一个return ans;
}

View Code

转载于:https://www.cnblogs.com/LiHior/p/6883166.html

KMP模版 KMP求子串在主串出现的次数模版相关推荐

  1. String类型的算法题(获取子串在主串中出现的次数)和(获取两个字符串中最大相同子串)-Java代码实现

    Java获取子串在主串中出现的次数 package BaiYSExer2;import org.junit.Test; /*** @author Baiysmart* @create 2020-03- ...

  2. JAVA常见算法题(三十三)---求子串在字符串中出现的次数

    计算某字符串中子串出现的次数. public static void main(String[] args) {String s1 = "adcdcjncdfbcdcdcd";St ...

  3. 【数据结构】顺序串的插入算法,删除算法,连接运算,顺序串求子串算法

    主函数自行添加 头文件 + 宏定义 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 串的顺序存储 type ...

  4. 4.3.2模拟匹配的一种改价算法(KMP及KMP优化算法)

    在上一节里面我们知道BF算法. 现在我们来讲解KMP算法.他的思路如下 每当一趟匹配过程中出现字符比较不等时,不需回溯i指针,而是利用已经得到的"部分匹配"的结果将模式想右滑动进可 ...

  5. KMP算法求解next数组值(模式串从下标0开始或从下标1开始)以及求值后与主串的匹配过程

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  6. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  7. HDU 1686 Oulipo【kmp求子串出现的次数】

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  8. (算法)通俗易懂的字符串匹配KMP算法及求next值算法

    大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法.KMP算法及next值的求法.在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一 ...

  9. KMP算法——快速求失效函数值及其代码实现

    前缀和后缀的最大相等长度 为了更好的理解我接下来所说的回溯值的求法,这里先介绍一下,如何求一个字符串的前缀和后缀相等的最大长度,为了便于说明记为k. 注意:前缀和后缀不能为字符串本身!!!!!! 如字 ...

最新文章

  1. LeetCode中等题之区域和检索 - 数组可修改
  2. 【Network Security!】Web安全学习及异或解密示例
  3. SpringBoot用Servlet处理请求
  4. java无法实例化类型_java – 无法实例化泛型中的类型
  5. kiftd 1.0.15 正式发布,青阳网络文件传输系统
  6. java 数据网格,easyui数据网格
  7. 生信分析和美图资源推荐!!!
  8. bzoj1452 [JSOI2009]Count
  9. ArrayList类源码阅读
  10. 方法论+本土特色,这个BPM平台不简单
  11. 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
  12. 二极管和极性电容的正负测量
  13. 在Android4.0以上设备的虚拟按键中显示menu键
  14. 获取IOS APP Icon
  15. PDPS软件:导出Web浏览器文件功能及其操作方法
  16. 自然语言处理(NLP)常用开源工具总结----不定期更新
  17. 存储引擎,表的数据类型
  18. 矩阵初等行变换的技巧
  19. 基于脉搏波信号和人工智能方法的应用
  20. UltraLAB基因测序、生物信息分析平台高性能工作站/集群最新硬件配置方案

热门文章

  1. 运行sqlplus时遇到cannot restore segment prot after reloc: Permission denied
  2. java8 并行执行方法_如何在Java8中执行此并行任务
  3. 前端跨域请求get_HTTP--跨域真的有这么难吗
  4. 集成运算同相放大器和反向放大器的选择
  5. Word中分节符的作用
  6. TinyOS下TOSSIM仿真
  7. python/numpy中数组array和矩阵matrix的区别
  8. python等差分解一个数
  9. 人工智能也能写出如此诗句
  10. Oracle XTTS跨平台数据库迁移(从Unix迁移数据库到Linux)_Oracle数据库迁移项