【算法Everyday】第三日 KMP算法
题目
你知道的。
分析
分析不来。
代码
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算法的更多相关文章
- 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...
- 算法-最通俗易懂的KMP算法详解
有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...
- c算法:字符串查找-KMP算法
/* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...
- 串匹配算法讲解 -----BF、KMP算法
参考文章: http://www.matrix67.com/blog/archives/115 KMP算法详解 http://blog.csdn.net/yaochunnian/artic ...
- 【数据结构&算法】10-串基础&KMP算法源码
目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORC ...
- 算法:KMP算法
算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...
- 数据结构之KMP算法next数组
我们要找到一个短字符串(模式串)在另一个长字符串(原始串)中的起始位置,也就是模式匹配,最关键的是找到next数组.最简单的算法就是用双层循环来解决,但是这种算法效率低,kmp算法是针对模式串自身的特 ...
- (原创)详解KMP算法
KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么 ...
- 深入理解KMP算法
前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...
随机推荐
- 多路复用的server模型
多路复用I/O之server模型 主要是关于select()这个函数: 其原型是:int select(int n,fd_set *read_fds,fd_set *write_fds,fd_set ...
- iOS-C文件添加到iOS项目中,运行报错
iOS-C文件添加到iOS项目中,运行报错 问题: 往项目中添加一个空的c文件, 编译运行; 出现2,30个编译错误. 原因: 由于在项目中添加了Pch文件,在文件中所有代码还没有开始运行之前, pc ...
- 观察者模式-Observer
观察者模式很好理解,简单来说就是:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系. 1. 自己手工创建Observer模式 首先,创建观察者接口: pub ...
- Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解
1. TreeSet保证元素唯一性和自然排序的原理和图解 2. TreeSet唯一性以及有序性底层剖析: 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法. 跟踪 ...
- 在Linux下用netstat查看网络状态、端口状态
在Linux下用netstat查看网络状态.端口状态 在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实 ...
- Java-Android 之短信发送
file:///F:/workspace3/Android_ver2.5/src/cn/szy/com/MainActivity.java package cn.szy.com; import jav ...
- android listview 替代品recyclerview详解
安卓v7支持包下的ListView替代品————RecyclerView RecyclerView这个控件也出来很久了,相信大家也学习的差不多了,如果还没学习的,或许我可以带领大家体验一把这个艺术 ...
- iOS中ARC内部原理
ARC会自动插入retain和release语句.ARC编译器有两部分,分别是前端编译器和优化器. 1. 前端编译器 前端编译器会为“拥有的”每一个对象插入相应的release语句.如果对象的所有权修 ...
- [转]mysql 导入导出数据库以及函数、存储过程的介绍
本篇文章是对mysql中的导入导出数据库命令以及函数.存储过程进行了详细的分析介绍,需要的朋友参考下: mysql常用导出数据命令:1.mysql导出整个数据库 mysqldump -hhostna ...
- (java)从零开始之--异常处理(以文件拷贝为例)
开发过程中避免不了对异常的处理,但是异常的处理又不能乱throw 下面是简单的抛异常处理 public static void CopyFile(String souFile,String dirFi ...