朴素的模式匹配算法(C++)

朴素的模式匹配算法,暴力,容易理解

#include<iostream>
using namespace std; int main()
{
string mainStr, str;
cin >> mainStr >> str;
int i, j, pos = -1, count = 0;
for(i = 0; i < mainStr.length(); i++)
{
for(j = 0; j < str.length(); j++, i++)
{
if(mainStr[i] != str[j])
{
break;
}
if(j == str.length() - 1)
{
if(count == 0)
{
pos = i - j; //记录第一个与str相等的字符串在主串mainStr中的第一个字母的下标
}
count++; //记录与str相等的字符串的数量
}
}
i = i - j; //对i值(主串指针)进行回溯操作
}
cout << "pos=" << pos << ",count=" << count << endl;
return 0;
}

KMP模式匹配算法(C++)

KMP模式匹配算法相比较朴素的模式匹配算法,减少了主串指针回溯的操作

#include<iostream>
using namespace std; int main()
{
string mainStr, str;
cin >> mainStr >> str;
int i, j, pos = -1, count = 0;
int next[256]; //计算next数组的数值
i = 0;
j = -1;
next[0] = -1;
while(i < str.length())
{
if(j == -1 || str[i] == str[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
} //查找子串的位置和数量
i = 0;
j = 0;
while(i < mainStr.length())
{
if(mainStr[i] != str[j])
{
j = next[j]; }
else
{
if(j == str.length() - 1)
{
if(count == 0)
{
pos = i - j; //记录子串第一次的第一个字母出现在主串中的位置
}
count++; //记录在主串中含有子串的数量
}
}
i++;
j++;
} cout << "pos=" << pos << ",count=" << count << endl;
return 0;
}

KMP模式匹配算法改进(C++)

改进操作在于计算next数组数值的时候考虑了特殊情况 —— 子串形如abcabcabx

#include<iostream>
using namespace std; int main()
{
string mainStr, str;
cin >> mainStr >> str;
int i, j, pos = -1, count = 0;
int next[256]; //计算next数组的数值
i = 0;
j = -1;
next[0] = -1;
while(i < str.length())
{
if(j == -1 || str[i] == str[j])
{
i++;
j++;
if(str[j] == str[i])
{
next[i] = next[j];
}
else
{
next[i] = j;
}
}
else
{
j = next[j];
}
} //查找子串的位置和数量
i = 0;
j = 0;
while(i < mainStr.length())
{
if(mainStr[i] != str[j])
{
j = next[j];
}
else
{
if(j == str.length() - 1)
{
if(count == 0)
{
pos = i - j; //记录子串第一次的第一个字母出现在主串中的位置
}
count++; //记录在主串中含有子串的数量
}
}
i++;
j++;
} cout << "pos=" << pos << ",count=" << count << endl;
return 0;
}

字符串的模式匹配算法——KMP模式匹配算法的更多相关文章

  1. C++编程练习(7)----“KMP模式匹配算法“字符串匹配

    子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...

  2. 数据结构——串的朴素模式和KMP匹配算法

    一.朴素模式 假设我们要从主串S="goodgoogle"中找到子串T="google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标, ...

  3. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  4. 串、KMP模式匹配算法

    串是由0个或者多个字符组成的有限序列,又名叫字符串. 串的比较: 串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号. 计算机中常用的ASCII编码,由8位二进制 ...

  5. 《数据结构》之串的模式匹配算法——KMP算法

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

  6. KMP模式匹配算法

    KMP模式匹配算法 相信很多人对于这个还有点不了解,或者说是不懂,下面,通过一道题,来解决软考中的这个问题! 正题: aaabaaa,其next函数值为多少? 对于这个问题,我们应该怎么做呢? 1.整 ...

  7. 线性表-串:KMP模式匹配算法

    一.简单模式匹配算法(略,逐字符比较即可) 二.KMP模式匹配算法 next数组:j为字符序号,从1开始. (1)当j=1时,next=0: (2)当存在前缀=后缀情况,next=相同字符数+1: ( ...

  8. 详细解读KMP模式匹配算法

    转载请注明出处:http://blog.csdn.net/fightlei/article/details/52712461 首先我们需要了解什么是模式匹配? 子串定位运算又称为模式匹配(Patter ...

  9. 字符串的朴素模式和KMP模式匹配

    先复习一下字符串指针: #include <iostream> #include <string.h> using namespace std; int main() { ch ...

随机推荐

  1. 工作流中的数据持久化详解!Activiti框架中JPA的使用分析

    Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获 ...

  2. TensorFlow创建DeepDream网络

    TensorFlow创建DeepDream网络 Google 于 2014 年在 ImageNet 大型视觉识别竞赛(ILSVRC)训练了一个神经网络,并于 2015 年 7 月开放源代码. 该网络学 ...

  3. YOLOv3和YOLOv4长篇核心综述(下)

    YOLOv3和YOLOv4长篇核心综述(下) 4.3.3 Neck创新 在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层,会插入一些层,这个部分称为Neck.相当于目标检测网络的 ...

  4. Redis6.x学习笔记(五)哨兵

    前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...

  5. JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace

    直接上代码: public class Test001 { public static void main(String[] args) { //java.lang.StackOverflowErro ...

  6. spring如何集成第三方框架? 比如mybatis

    实体Bean的创建: 1: 基于class构建, 2: 构造方法构建 3: 静态工厂方法创建 4: FactoryBean构建 spring如何集成第三方框架? 比如mybatis 在mybatis中 ...

  7. NX二次开发-获取WCS标识

    函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...

  8. 面试官:为什么Mysql中Innodb的索引结构采取B+树?

    前言 如果面试官问的是,为什么Mysql中Innodb的索引结构采取B+树?这个问题时,给自己留一条后路,不要把B树喷的一文不值.因为网上有些答案是说,B树不适合做文件存储系统的索引结构.如果按照那种 ...

  9. hackthebox TheNotebook

    前言 只拿到了user,提权没成功--有wp说是CVE-2019-5736,我没打成. 打点 nmap-sV -v -A 10.10.10.230 端口扫描结果: PORT STATE SERVICE ...

  10. jquery循环动画

      <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title&g ...