#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算法的实现的更多相关文章

  1. KMP算法的实现

    今天看到了一篇关于KMP算法的讲解的文章,很难得,讲得非常清楚.分享给大家,希望对大家有帮助.http://kb.cnblogs.com/page/176818/ 我自己基于这个讲解的内容作了一个实现 ...

  2. KMP算法的实现(Java语言描述)

    标签:it KMP算法是模式匹配专用算法. 它是在已知模式串的next或nextval数组的基础上执行的.如果不知道它们二者之一,就没法使用KMP算法,因此我们需要计算它们. KMP算法由两部分组成: ...

  3. 【字符串匹配】KMP算法和next数组的c/c++实现

    KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看 ...

  4. 数据结构与算法JavaScript (五) 串(经典KMP算法)

    KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...

  5. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  6. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  7. RMQ问题总结,标准RMQ算法的实现

    RMQ问题:对于长度为N的序列,询问区间[L,R]中的最值 RMQ问题的几种解法: 普通遍历查询,O(1)-O(N) 线段树,O(N)-O(logN) DP,O(NlogN)-O(1) RMQ标准算法 ...

  8. 图像数据到网格数据-2——改进的SMC算法的实现

    概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...

  9. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

随机推荐

  1. xcode7启动页的尺寸设置

    iPhone Portrait iOS 8,9-Retina HD 5.5 (1242×2208) @3x iPhone Portrait iOS 8,9-Retina HD 4.7 (750×133 ...

  2. iOS SDwebImage 使用说明

    SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...

  3. 动效解析工厂:Mask 动画

    转载自:http://www.cocoachina.com/ios/20160214/15250.html 前言:很多动效都是多种动画的组合,有时候你可能只是需要其中某个动画,但面对庞杂的代码库或是教 ...

  4. 关于Java中的选择排序法和冒泡排序法

    一,这种方法是直接传入一个数组进行排序(选择排序法) public static void selectSort(int arr[]){ for (int i = 0; i < arr.leng ...

  5. select源码分析(linux2.6.11)

    本文以tcp poll为例子来分析select的源码,下面是函数调用顺序.select--->sys_select->do_select--->sock_poll--->tcp ...

  6. hibernate映射

    三种方式:     持久化注解   目前开发主流方式     XML配置描述文件(XML deployment descriptor,可以让Hibernate的PO类与JPA实体类兼容,实际中很少用) ...

  7. php 常用

    零:重要的PHP超级全局变量 1.$_SERVER $_SERVER超级全局变量包含由web服务器创建的信息,它提供了服务器和客户配置及当前请求环境的有关信息.根据服务器不同,$_SERVER中的变量 ...

  8. C# this.Invoke()的作用和用法(摘)

    Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();   在多线程编程中,我们经常要在工作线程 ...

  9. JSTL详解

    一.理论准备         JSP 标准标记库( Standard Tag Library , JSTL) 是一组以标准化格式实现许多通用的 Web 站点功能的定制标记,主要是为了方便页面的编写. ...

  10. jQuery Mobile 控制 select 的显示隐藏 display none

    如需要动态控制下拉选择菜单select的显隐,一般考虑使用display:none这个方法. 但在jQueryMobile中的select添加自定义的css,display:none 是无效的. 解决 ...