C++经典KMP算法的实现
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std; bool KMP(const string &s1, const string &s2); vector<int> findMatchInFrontAndBack(const string &s2);
int partPi(const string &amatch); int main()
{
cout << "这个程序能够判断s1内是否包含s2" << endl;
string s1, s2;
cout << "请输入字符串1" << endl;
cin >> s1;
cout << "请输入字符串2" << endl;
cin >> s2; KMP(s1, s2); return ;
} bool KMP(const string &s1, const string &s2)
{
if (s2.size()>s1.size())
{
cout << "字符串1里面不包含字符串2" << endl; return false;
}
else
{
vector<int> nodes = findMatchInFrontAndBack(s2); int histroySite = ; while (s1.size() - s2.size() >= histroySite)
{
int matchNum = ; bool allOverMatch = true;
for (int i = ;i<s2.size();++i)
{
if (s1[histroySite + i] != s2[i])
{
allOverMatch = false; if (matchNum == )
{
++histroySite;
}
else
{
histroySite += (matchNum - nodes[i]);
}
break;
}
else
{
++matchNum;
}
} if (allOverMatch)
{
cout << "s1中包含s2" << endl; cout << s1 << endl; for (int i = ;i<histroySite;++i)
{
cout << " ";
}
cout << s2 << endl; return true;
}
} cout << "字符串1里面不包含字符串2" << endl;
return false;
}
} vector<int> findMatchInFrontAndBack(const string &s2)
{
if (s2.size() == )
{
vector<int> nodeOfMatch = { };
return nodeOfMatch;
}
else
{
vector<int> nodeOfMatch(s2.size() - , ); auto be = s2.begin(); auto en = be + ; for (int i = ;i<s2.size() - ;++i)
{
string amatch; amatch.insert(amatch.end(), be, en); nodeOfMatch[i] = partPi(amatch); ++en;
} nodeOfMatch.push_back(); return nodeOfMatch;
}
} int partPi(const string &amatch)
{
vector<string> frontOfString;
vector<string> backOfString; auto startOne = amatch.begin();
auto nextOne = startOne + ; for (int i = ;i<amatch.size() - ;++i)
{
string fs, bs; fs.insert(fs.end(), startOne, nextOne);
bs.insert(bs.end(), nextOne, amatch.end()); frontOfString.push_back(fs);
backOfString.push_back(bs); ++nextOne;
} sort(frontOfString.begin(), frontOfString.end());
sort(backOfString.begin(), backOfString.end()); int highestNum = ; while (frontOfString.size() != && backOfString.size() != )
{
auto s1 = frontOfString.begin();
auto s2 = backOfString.begin(); if (*s1 == *s2)
{
if (s1->size()>highestNum)
{
highestNum = s1->size();
} frontOfString.erase(s1);
backOfString.erase(s2);
}
else if (*s1<*s2)
{
frontOfString.erase(s1);
}
else
{
backOfString.erase(s2);
}
} return highestNum;
}
C++经典KMP算法的实现的更多相关文章
- KMP算法的实现
今天看到了一篇关于KMP算法的讲解的文章,很难得,讲得非常清楚.分享给大家,希望对大家有帮助.http://kb.cnblogs.com/page/176818/ 我自己基于这个讲解的内容作了一个实现 ...
- KMP算法的实现(Java语言描述)
标签:it KMP算法是模式匹配专用算法. 它是在已知模式串的next或nextval数组的基础上执行的.如果不知道它们二者之一,就没法使用KMP算法,因此我们需要计算它们. KMP算法由两部分组成: ...
- 【字符串匹配】KMP算法和next数组的c/c++实现
KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看 ...
- 数据结构与算法JavaScript (五) 串(经典KMP算法)
KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- C++基础代码--20余种数据结构和算法的实现
C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...
- RMQ问题总结,标准RMQ算法的实现
RMQ问题:对于长度为N的序列,询问区间[L,R]中的最值 RMQ问题的几种解法: 普通遍历查询,O(1)-O(N) 线段树,O(N)-O(logN) DP,O(NlogN)-O(1) RMQ标准算法 ...
- 图像数据到网格数据-2——改进的SMC算法的实现
概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
随机推荐
- 【Windows】Windows中的数据类型以及命名
一.大写标示符 Windows中的很多标识符都是以两个或者三个大写字母作为前缀的,且其后紧跟一个下划线.这些标识符都是常量数值,前缀表明该常量的一般类别.如下 前缀 常量 CS(Class Style ...
- 分享一张oracle scan图
- CoreAnimation5-图层时间和缓冲
图层时间 动画的发生是需要持续一段时间的,所以计时对整个概念来说至关重要.在这一章中,我们来看看CAMediaTiming,看看Core Animation是如何跟踪时间的. CAMediaTimin ...
- C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN
C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN.NET 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够 ...
- 菜鸟日记之JSP1
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsyste ...
- Linux Bash环境下单引(')、双引号(")、反引号(`)、反斜杠(\)的小结
在bash中,$.*.?.[.].’.”.`.\.有特殊的含义.类似于编译器的预编译过程,bash在扫描命令行的过程中,会在文本层次上,优先解释所有的特殊字符,之后对转换完成的新命令行,进行内核的系统 ...
- wel
欢迎来到mathant.com 这个网站是什么 这个网站是我搭建在阿里云vps上的个人网站.目前的用途是充当个人博客和云存储,当然它的功能不止如此.我会在以后的日子里完善他,希望他能变得更好.目前我在 ...
- 汤姆大叔的6道js题目
汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...
- ListView复用和优化详解
我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率,而内部实现的一种优化,牺牲一点内存.而 ...
- PHPExcel导出excel
如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312: $yourStr = mb_convert_encoding("g ...