题目

你知道的。

分析

分析不来。

代码

void OutputArray(int* pArr, int iLen)
{
for (int i = 0; i < iLen; i++)
{
printf("%d\t", pArr[i]);
}
printf("\n");
} void GetNextValue(char const* szPattern, int iLen, int* pNextArr)
{
int i = 0;
pNextArr[i] = -1;
int j = -1;
while (i < iLen - 1)
{
if (j == -1 || szPattern[i] == szPattern[j])
{
++i;
++j;
if (szPattern[i] != szPattern[j])
pNextArr[i] = j;
else
pNextArr[i] = pNextArr[j];
}
else
j = pNextArr[j];
}
} int KMP(const char * szTarget, const char * szPattern)
{
int iSrcLen = strlen(szTarget);
int iPatternLen = strlen(szPattern); int* pNextArr = new int[iPatternLen];
GetNextValue(szPattern, iPatternLen, pNextArr);
OutputArray(pNextArr, iPatternLen); int targetIndex = 0;
int patternIndex = 0;
while (targetIndex < iSrcLen && patternIndex < iPatternLen)
{
if (patternIndex == -1 || szTarget[targetIndex] == szPattern[patternIndex])
{
++targetIndex;
++patternIndex;
}
else
{
patternIndex = pNextArr[patternIndex];
}
} delete[] pNextArr; if (patternIndex >= iPatternLen)
return targetIndex - iPatternLen;
else
return -1;
} void GetNextValue2(char const* szPattern, int iLen, int* pNextArr)
{
int index = 0;
pNextArr[0] = -1;
for (int i = 1; i < iLen; ++i)
{
index = pNextArr[i - 1];
while (index >= 0 && szPattern[index + 1] != szPattern[i])
{
index = pNextArr[index];
}
if (szPattern[index + 1] == szPattern[i])
{
pNextArr[i] = index + 1;
}
else
{
pNextArr[i] = -1;
}
}
} int KMP2(const char* szTarget, const char* szPattern)
{
const int iSrcLen = strlen(szTarget);
const int iPatternLen = strlen(szPattern); int* pNextArr = new int[iPatternLen]; GetNextValue2(szPattern, iPatternLen, pNextArr);
OutputArray(pNextArr, iPatternLen); int patternIndex = 0;
int targetIndex = 0;
while (patternIndex < iPatternLen && targetIndex < iSrcLen)
{
if (szTarget[targetIndex] == szPattern[patternIndex])
{
++targetIndex;
++patternIndex;
}
else if (patternIndex == 0)
{
++targetIndex;
}
else
{
patternIndex = pNextArr[patternIndex - 1] + 1;
}
} delete[] pNextArr; if (patternIndex == iPatternLen)
return targetIndex - patternIndex;
else
return -1;
}

【算法Everyday】第三日 KMP算法的更多相关文章

  1. 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现

    1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...

  2. 算法-最通俗易懂的KMP算法详解

    有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...

  3. c算法:字符串查找-KMP算法

    /* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...

  4. 串匹配算法讲解 -----BF、KMP算法

      参考文章: http://www.matrix67.com/blog/archives/115     KMP算法详解 http://blog.csdn.net/yaochunnian/artic ...

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

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

  6. 算法:KMP算法

    算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...

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

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

  8. (原创)详解KMP算法

    KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么 ...

  9. 深入理解KMP算法

    前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...

随机推荐

  1. [CodeForce]356D Bags and Coins

    已知有n个包,和总共s个钱币. n,s<=70000. 每个包可以装钱币,还可以套别的包.每个包中的钱数等于 所有套的包的钱数 加上 自己装的钱. 所有的钱都在包内. 问给定每个包中的钱数,输出 ...

  2. PhoneGap 在eclipse上开发Android程序

    本文将记录在Eclipes上开发Android App,在使用的方法是Hybrid App(混合模式移动应用), 由于本人的工作需要,将要开发在车间使用的数据录入程序,但是其中有非常多的逻辑验证和判断 ...

  3. Myeclipse快捷键的设置

  4. Android开发常见错误类型一览表

    这是我的第一个博客,我会一直添加我在Android开发中遇到的错误,用来记录我开发中踩过的那些坑 ------------------------分割线------------------------ ...

  5. Android EditText自动弹出输入法焦点

    http://mobile.51cto.com/aprogram-403138.htm 1. 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...

  6. cookie防篡改

    概述: 除了 session 外,一般不会在客户端的 cookies 里保存过于重要的凭据,但电商应用有时候不可避免地存储了一些敏感数据到客户端,当然不希望被篡改. 目的: 让服务器端能识别cooki ...

  7. [笔记]SD卡相关资料

    ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...

  8. Alljoyn 概述(3)

    开发工具 • scons:一个 Python写的自动化构建工具,是对 gnu make 改进的替代工具 • D-Feet:一个D-Bus调试工具 • C++ Code Generator Tool ( ...

  9. 获取Host文件权限 注册表导入

    Windows Registry Editor Version 5.00 ;取得文件修改权限 [HKEY_CLASSES_ROOT\*\shell\runas] @="管理员权限" ...

  10. PHP算法 《图》 之 理论基础

    转载自:http://www.cnblogs.com/skywang12345/p/3691463.html Ⅰ 图的基本概念 1. 图的定义 定义:图(graph)是由一些点(vertex)和这些点 ...