KMP算法用于模式串字符匹配,因为没有提前预习,上课时听得云里雾里,后来回去看了一晚上,翻了一些网上的讲解才理解了。我简单讲一下,我们在一串字符串A里搜索匹配另一段字符串B时,思路最简单方法的就是从第一位开始一个个对照匹配,出现错误就移动到第二个字符继续匹配,不匹配再第三个。但这样毕竟性能比较低,KMP引入了一个next数组,先将需要匹配的这段字符B计算出next值,在AB匹配的时候如果出现不匹配的情况,就根据next值跳到对应的字符继续匹配,所以中间就省略了一些不必要的匹配,从而提高了性能。next值的计算网上有很几种不同的方法,初始下标从-1~1都有。我学习的主要是严蔚敏老师的书,从0开始,第二位是1,书里是根据最经典的next值计算公式计算的。贴下代码让大家参考一下,具体的next值计算回学校拿到书后更新。

第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串
以此类推
第一行输出第1个实例的模式串的next值
第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0
以此类推

#include <iostream>
#include <string> using namespace std; class myString
{
private:
string mainstr;
int size; void GetNext(string p,int next[]);
int KMPFind(string p,int pos,int next[]); public: myString();
~myString();
void SetVal(string sp);
int KMPFindSubsstr(string p,int pos);
}; myString::myString()
{
size = ;
mainstr = "";
}
myString::~myString()
{
size = ;
mainstr = "";
} void myString::SetVal(string sp)
{
mainstr = "";
mainstr.assign(sp);
size = mainstr.length();
} int myString::KMPFindSubsstr(string p,int pos)
{
int i;
int L = p.length();
int *next = new int[L+];
next[] = ;
GetNext(p,next);
for(i=;i<=L;i++)
{
cout <<next[i] <<' ';
}
cout<<endl;
int v = -;
v = KMPFind(p,pos,next); delete []next;
return v;
} void myString::GetNext(string p,int next[])
{
int i=,j=;
next[]=;
while(i<p.length())
{
if(j==||p[i-]==p[j-]){
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
} int myString::KMPFind(string p,int pos,int next[])
{
int i,j;
i=pos;
j=;
while(i<=mainstr.length()&&j<=p.length())
{
if(j==||mainstr[i-]==p[j-])
{
++i;++j;
}
else j=next[j];
}
if(j>p.length())
{
return i-p.length();
}
else
{
return ;
}
} int main()
{
int num;
cin>> num;
for(int i=;i<num;i++)
{
string main,pattern;
cin >>main;
myString NewString;
NewString.SetVal(main);
cin >>pattern;
cout <<NewString.KMPFindSubsstr(pattern,) <<endl;
}
return ;
}

基础数据结构-串-KMP算法的更多相关文章

  1. 【数据结构】KMP算法

    我还是不太懂... 转2篇大神的解释    1>https://www.cnblogs.com/yjiyjige/p/3263858.html     2>https://blog.csd ...

  2. 数据结构之KMP算法next数组

    我们要找到一个短字符串(模式串)在另一个长字符串(原始串)中的起始位置,也就是模式匹配,最关键的是找到next数组.最简单的算法就是用双层循环来解决,但是这种算法效率低,kmp算法是针对模式串自身的特 ...

  3. ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树

    五.KMP算法:    *KMP算法是一种改进的字符串匹配算法.    *KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函 ...

  4. LeetCode刷题--基础知识篇--KMP算法

    KMP算法 关于字符串匹配的算法,最知名的莫过于KMP算法了,尽管我们日常搬砖几乎不可能去亲手实现一个KMP算法,但作为一种算法学习的锻炼也是很好的,所以记录一下. KMP算法是根据三位作者(D.E. ...

  5. KMP算法的一次理解

    1. 引言 在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了.KMP本身不复杂,但网上绝大部分的文章把它讲混乱了.下面,咱们从暴力匹配算法讲起,随 ...

  6. 我对KMP算法的理解

    KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...

  7. 【数据结构&算法】10-串基础&KMP算法源码

    目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORC ...

  8. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  9. 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构

    题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...

随机推荐

  1. 使用python爬虫抓站的一些技巧总结:进阶篇

    Reference:http://python.jobbole.com/82000/ 一.gzip/deflate支持 现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页 ...

  2. 在ubtuntu中使用包管理器 linux-brew

    用惯了mac的程序员回到linux开发平台总觉得有点不适应,这是因为linux的界面没有mac那么精美,而且linux的包管理器没有mac上面的homebrew那么强大.mac程序员遇到库的依赖问题时 ...

  3. ExcelUtil

    package cn.com.jansh.core.util; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi ...

  4. [oracle]Oracle角色管理

    假如我们直接给每一个用户赋予权限,这将是一个巨大又麻烦的工作,同时也不方便DBA进行管理.通过采用角色,使得: 权限管理更方便.将角色赋予多个用户,实现不同用户相同的授权.如果要修改这些用户的权限,只 ...

  5. --@angularJS--较复杂的指令嵌套demo——综合小实例:登陆界面

    1.index.html: <!DOCTYPE HTML><html ng-app="app"><head>    <title>c ...

  6. spring mvc rest 方式

    handler中编写方式: @RequestMapping("/{userName}/ajaxUser3.do") @ResponseBody public UserInfo aj ...

  7. log4j.appender.stdout.layout.ConversionPattern

    http://501565246-qq-com.iteye.com/blog/1991881 http://wenku.baidu.com/link?url=e4Z9v9CY_gwRxHrggzHXx ...

  8. Java泛型类型擦除导致的类型转换问题

    初步结论:泛型类型转换不靠谱: 源码: package com.srie.testjava; public class TestClassDefine4<T> { public stati ...

  9. SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

    -- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='proc ...

  10. DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱.不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬.(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...).已经上班两天了,公司大部分人还在休假,而我早已上班, ...