朴素的模式匹配算法(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. 巧用Reflections库实现包扫描

    1.需求 需要扫描某个包中的某个接口的实现类的需求 2.maven 依赖引入 <dependency> <groupId>org.reflections</groupId ...

  2. 为什么要用redux?

             redux解决的是react组件之间通信以及项目的状态变量的保存问题.如果不使用redux,随着项目的越来越大,组件之间通信越来越复杂,组件的状态越来越多,项目将越来越难以维护.使用 ...

  3. B-Tree插入和删除的Java实现

    B-Tree插入和删除的Java实现 一.一颗非空m阶B-Tree的性质 除根结点以外的每个结点的孩子引用最多存在m个,关键码最多存在m - 1个:除根结点以外的每个结点的孩子引用至少存在⌈m / 2 ...

  4. InnoDB 静态数据加密的常见问题合集

    1. 数据是否为有权查看数据的用户解密? 是的.InnoDB静态数据加密旨在透明地在数据库中应用加密,而不会影响现有应用程序.以加密格式返回数据会破坏大多数现有应用程序. InnoDB静态数据加密提供 ...

  5. centos 7 iotop 安装

    安装指令:yum -y install iotop 指定查看aubunt 用户的读写状态:iotop -u aubunt -P -k -t 允许在非交互模式下每隔3秒刷新一次,只刷新6次:iotop ...

  6. MySQL:数据库优化,看这篇就够了

    数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷. 1. 优化一览 ...

  7. 【题解】数颜色 STL vector数组

    小 C 的兔子不是雪白的,而是五彩缤纷的. 题目 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n只兔子排 ...

  8. NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

    工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

  9. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  10. 重新整理 .net core 实践篇—————Mediator实践[二十八]

    前言 简单整理一下Mediator. 正文 Mediator 名字是中介者的意思. 那么它和中介者模式有什么关系呢?前面整理设计模式的时候,并没有去介绍具体的中介者模式的代码实现. 如下: https ...