题目

你知道的。

分析

分析不来。

代码

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. SQL Cursor 基本用法

     1 table1结构如下  2 id    int  3 name  varchar(50)  4   5 declare @id int  6 declare @name varchar(50) ...

  2. Asp.net主题(theme)和皮肤(skin)的使用

    asp.net 的服务器端控件提供了多种样式的设计,如果对每个控件都单独设置,是比较繁琐的事情,所以微软也提供了针对这些服务器端控件的样式管理,其实也可以通过 css来控制部分服务器端控件的样式,比如 ...

  3. java移位运算的用途

    参考下面这篇文章 http://blog.csdn.net/gaowen_han/article/details/7163104 http://jinguo.iteye.com/blog/540150 ...

  4. Android Studio创建工程时一直卡在下载Gradle

    一直提示这个进度条,查了不少资料,有的说FQ,有的说下载gradle后运行下bin里面的批处理,再在环境变量里Path中加入路径,我都试了,都不和... 按理说FQ了可以下载了吧,但是半天没下载完,一 ...

  5. JQ 日期格式化

    将字符转换为日期格式: function getDate(strDate) { var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$ ...

  6. Activity的几种启动跳转方式

     一.显示调用方法 •Intent intent=new Intent(this,OtherActivity.class); //方法1 •Intent intent2=new Intent(); • ...

  7. Android App优化建议(转载)

    假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比.耗电.耗内存.接下来就会得到用户的消极评论,最后名声也就臭了.即使你的应用设计精良.创意无限也没用. 耗电或者内存占用等 ...

  8. OpenWrt启动过程分析

    openwrt是通过一系列shell脚本进行启动流程的组织,下面是启动流程的提纲.如 果想详细了解启动的过程,则需要仔细走读脚本文件. 1. 在make menuconfig 选择target平台 B ...

  9. CI 笔记(1)

    1. 下载CI,官方网站,目前3.x版本已经更新,2.2.6版本为2.x版本的最后的一个版本.为了和视频教材一致,使用CI 2.x版本 2. 目录结构,从application里面的,controll ...

  10. 为Angular-UEditor增加工具栏属性

    感谢胡大大分享的的开源项目 Angular 的 UEditor 插件 Angular-UEditor 本文只是修改了angular-ueditor.js,加入了对工具栏的定制,方便项目使用 1 (fu ...