题目

你知道的。

分析

分析不来。

代码

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. IOS-tableView中的cellHeadView随着table滚动

    IOS-tableView中的cellHeadView随着table滚动 设置table的style 首先要将table设置为UITableViewStyleGrouped类型.这样就会得到table ...

  2. HDU 5592 ZYB's Premutation(树状数组+二分)

    题意:给一个排列的每个前缀区间的逆序对数,让还原 原序列. 思路:考虑逆序对的意思,对于k = f[i] - f[i -1],就表示在第i个位置前面有k个比当前位置大的数,那么也就是:除了i后面的数字 ...

  3. foreach遍历----for(object o: list)

    备注,两种写法是一样的.

  4. Android开发手记(32) 使用摄像头拍照

    在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:na ...

  5. 【原创】不用封装jar包 直接引入工程使用的方法(类似android的 is Library功能)

    1.制作lib工程,这里我简单制作一个测试类 2.eclipse中 java Project工程引入方法 2.1.新建个java工程,在属性配置中选择 "Java Build Path&qu ...

  6. iOS如何准确获取通知

    iOS获取通知需要注意以下三个地方iOS 设备收到一条推送(APNs),用户点击推送通知打开应用时,应用程序根据状态不同进行处理需在 AppDelegate 中的以下两个方法中添加代码以获取apn内容 ...

  7. 层模型--绝对定位(position:absolute)

    如果想为元素设置层模型中的绝对定位,需要设置position:absolute(表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用left.right.top.bottom属性相对于其最接 ...

  8. 使用OC开发phonegp 组件

    使用OC开发phonegp 组件 1. 使用oc 对phonegp中的组件近些开发,首先具体的pgonegp跟nativecode之间的一些优劣就不说了,开发phonegp 对应的组件主要就是使用na ...

  9. Linux 删除文件夹

    inux删除目录很简单,很多人还是习惯用rmdir 1.直接rm就可以了:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思

  10. contos 安装jdk1.8

    JDK安装配置 查看centos系统32位还是64位, 使用命令uname -a;x86是386,586系列的统称,主要是指指令集合.X64才是cpu对64位计算的支持版本. 1. 下载jdk,本例使 ...