#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. 浏览器兼容问题----Firefox不兼容event的解决方法

    一.event.srcElement:当前事件的源: 在IE下,event对象有srcElement属性,但是没有target属性;Firefox下,event对象有target属性,但是没有srcE ...

  2. C# 静态类和非静态类的区别

    静态类和非静态类的区别 静态类: static       关键字 调用 类名.方法 在静态方法中只能访问静态成员  在静态类中只能有静态成员 在非静态类中 即可有非静态成员,也可以有静态成员 在静态 ...

  3. 输出不大于N的素数的个数

    输出不大于N的素数的个数 Sieve of Eratosthenes 方法  素数的性质: 非素数可以分解为素数乘积. 证明 (1)n = 2 成立,n = 3 成立: (2)若 n = k 时成立, ...

  4. 说说http请求

    为什么做web前端要了解http标准?因为浏览器要从服务端获取网页,网页也可能将信息再提交给服务器,这其中都有http的连接.web系统既然和http链接有瓜葛,你就必须去了解它.我将从一下几个方面讲 ...

  5. linux安装git方法(转)

    转自:http://jingyan.baidu.com/article/e9fb46e16698687521f766ec.html 以下内容亲测,确实可行. 由于我的机器是linux6.7,所以省略了 ...

  6. Centos 6 设置静态 IP 地址

    编辑文件进行IP设置: [root@test1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 原文件内容前面加#被注释掉 下面为新加的内容 #DEV ...

  7. 20 Valid Parentheses(匹配括号)

    题目意思:判断一个字符串(){}[]是否符合 思路:用栈ps:实习一个多月了,代码也刷不动了,状态真不是一般的差 class Solution { public: bool isValid(strin ...

  8. oracle删除用户所有表

    在删除数据表的时候往往遇到外键约束无法删除的情况,我们可以通过以下几步将数据库表删除,建议在删除库之前先对数据库进行备份,养成良好习惯. 1.删除外键 --查询用户所有表的外键,owner条件为use ...

  9. React 学习资源分享 菜鸟刚学5天 博客写的不多 不懂写博客的套路

    http://www.ruanyifeng.com/blog/2015/03/react.html 首先个人强烈推荐 阮一峰的React基础 细细过一遍,看得出大师的用心良苦 然后就开始看书般的过ht ...

  10. 百度劫持js代码

    js代码为: var myDate=new Date(); //返回一日期对象,可以调用getDate(),内容为当前时间,这句是新建一个对象d建好对象后d就有函数date()中的所有特性 var h ...