查找字符串的 KMP 算法
查找字符串是我们平常编程过程中经常遇到的,现在介绍一种查找字符串算法,增加程序的执行速度。
通常我们是这么写的:
/*
content: search a string in a othor string
author: lw
date: 2015-01-30
target: kmp algorithm
*/ #include <stdio.h>
#include <string.h> void compare(char * sourcestr, char * targetstr)
{
char *moveSource, *moveTarget, *headPoint;
int num = ;
headPoint = sourcestr;
moveSource = sourcestr;
moveTarget = targetstr;
while(*headPoint != *moveTarget)
headPoint++;
moveSource = headPoint;
while(*moveSource != '\0' && *moveTarget != '\0')
{
num++;
moveSource++;
moveTarget++;
if(num == )
break;
while(*moveSource != *moveTarget)//-->kmp
{
headPoint = headPoint + ;
moveSource = headPoint;
num = ;
moveTarget = targetstr;
}
}
printf("%s\n", headPoint);
} int main()
{
char *source = "mabveacabiabcy";
char *target = "abc";
char *sourcestr;
char *targetstr;
sourcestr = (char *)malloc( * sizeof(char));
targetstr = (char *)malloc( * sizeof(char));
memset(sourcestr, '\0', * sizeof(char));
memset(targetstr, '\0', * sizeof(char));
strncpy(sourcestr, source, );
strncpy(targetstr, target, );
compare(sourcestr, targetstr);
return ;
}
现在把函数 compare() 函数中的内 while() 中的内容改进一下:
说明:拿字符串 mabveacabiabcy 来说,当查找到字符 v 时发现和 abc 中的 c 不同,则指向字符串 mabveacabiabcy 中的第二个字符的指针就要移动,如果不使用 kmp 算法,那么指针移动一位,如果使用 kmp 算法,则指针移动两位,因为当比较到字符 v 时我们实际已经知道 v 以前的字符是什么了,所以可以断定不止要移动一位,具体移动几位就和字符串 abc 有关了,要判断其是否回文字符串,此例中 abc 对应数组 1,2,0 。
修改后的代码如下:
/*
content: search a string in a othor string
author: lw
date: 2015-01-30
target: kmp algorithm
*/ #include <stdio.h>
#include <string.h> void compare(char * sourcestr, char * targetstr)
{
char *moveSource, *moveTarget, *headPoint;
int num = ;
headPoint = sourcestr;
moveSource = sourcestr;
moveTarget = targetstr;
while(*headPoint != *moveTarget)
headPoint++;
moveSource = headPoint;
while(*moveSource != '\0' && *moveTarget != '\0')
{
num++;
moveSource++;
moveTarget++;
if(num == )
break;
while(*moveSource != *moveTarget)//-->kmp
{
if(num > )
headPoint = headPoint + num;
else
headPoint = headPoint + ;
moveSource = headPoint;
num = ;
moveTarget = targetstr;
}
}
printf("%s\n", headPoint);
} int main()
{
char *source = "mabveacabiabcy";
char *target = "abc";
char *sourcestr;
char *targetstr;
sourcestr = (char *)malloc( * sizeof(char));
targetstr = (char *)malloc( * sizeof(char));
memset(sourcestr, '\0', * sizeof(char));
memset(targetstr, '\0', * sizeof(char));
strncpy(sourcestr, source, );
strncpy(targetstr, target, );
compare(sourcestr, targetstr);
return ;
}
查找字符串的 KMP 算法的更多相关文章
- 子字符串查找之————关于KMP算法你不知道的事
写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...
- 字符串模式匹配KMP算法
一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...
- 字符串类——KMP算法的应用
1,字符串类中的新功能(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述函数实现原理): 2,子串查找(KMP 算法直接运用): 1,int indexOf(const char* s) ...
- [Algorithm] 字符串匹配算法——KMP算法
1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串& ...
- 字符串匹配算法——KMP算法
处理字符串的过程中,难免会遇到字符匹配的问题.常用的字符匹配方法 1. 朴素模式匹配算法(Brute-Force算法) 求子串位置的定位函数Index( S, T, pos). 模式匹配:子串的定位操 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- 字符串匹配算法-kmp算法
一原理: 部分转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字 ...
- 字符串匹配算法KMP算法
数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...
- 数据结构4.3_字符串模式匹配——KMP算法详解
next数组表示字符串前后缀匹配的最大长度.是KMP算法的精髓所在.可以起到决定模式字符串右移多少长度以达到跳跃式匹配的高效模式. 以下是对next数组的解释: 如何求next数组: 相关链接:按顺序 ...
随机推荐
- SpringMvc异常
局部异常:在controller内部写一个处理异常的方法,注解ExceptionHandler(value={自己弄的异常class}) 这样发生value里面的类的异常,就可以执行这个方法,然后往r ...
- C++ primer的第三章的主要内容
第三章主要介绍了C++中标准库类型.主要讲到string和vector类型.在string类型中,能够很方便的操作字符串,应该要注意的地方就是它的字符串中元素的位置的类型是:size_type类型的数 ...
- SharePoint 2013 运行在IIS 应用32位错误
问题描述: 今天有一个项目因为用了OWC11,没有64位的dll,因此IIS设置了“启用32位应用程序”为true. 如图: 详细操作见:http://www.cnblogs.com/cainiaog ...
- char, signed char, and unsigned char in C++
关于这三者的区别stackoverrflow里有一个答案是这样说的: 3.9.1 Fundamental types [basic.fundamental] 1 Objects declared as ...
- php大力力 [020节]mysql数据库唯一id字段如何设置
2015-08-26 php大力力020.mysql数据库唯一id字段如何设置 不懂 以下有些文章 mysql唯一id 自动生成 uuid mysql 里面可以用uuid()语句来生成一个UUID:s ...
- Interview----2 sum
题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组 ...
- 将byte[]数组数据转换为图片用于预览显示
假如服务器返回给你的图片信息是byte[] 然后你需要将起转换成图片显示到你的view中去: 按以下的步骤 1.将获取的byte数组保存 假如为temp[]; 2.将temp[]转化为bitmap,你 ...
- 程序员是怎么炼成的---OC题集--练习答案与题目(1)
一. 1. 定义3个类,全部代码.效果:能默写,关键词全部正确. 2. ⾯面向对象和⾯面向过程有什么区别? 答:面向对象以事物(对象)为核⼼,完成事件只是一个任务.面向过程以事件为核心,为了完成任务, ...
- DXUT初步理解
关于DXUT框架: DXUT(The DirectX Utility Library) 是建立在Direct3D9 和Direct3D10 API上的一个程序框架.它的目标是建立一个强大而容易使用的D ...
- 如何给magento的产品页面添加返回按钮
如何给magento的产品页面添加返回按钮,最模板提供教程 第一步: 打开 E:\xampp\htdocs\magento\skin\frontend\default\bluescale\css\st ...