查找字符串的 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数组: 相关链接:按顺序 ...
随机推荐
- APC to USB
from :http://www.allpinouts.org/index.php/APC_USB_cable_schematic connector or cable wiring APC part ...
- 红帽中出现”This system is not registered with RHN”的解决方案
原因是你的linux没有在红帽网络上注册,所以无法下载上面的软件包,替代方案可以使用centos. 下面介绍下使用centos 的流程 1.卸载rhel的默认安装的yum包查看yum包rpm -qa| ...
- JDBC体会
1.把mysql-connector XXXX版本导入buildpath 2.通过DriverManager 的getConnection 方法获得一个Connnection引用,方法的参数是 url ...
- php练习题:投票
通过连接数据库,对数据库的增删改来实现一个投票的进行与结果的显示: 方法一: 主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- false等于0???
看到一个函数strpos($string,$str),用于在字符串$string中查找$str,如果在$string中查找到$str,则返回第一次出现的位置,起始位置为0:如果$string中不包含$ ...
- 10、SQL基础整理(约束2)
约束 除主键约束.外键约束外 唯一约束(主键列.索引列的候选索引) 设计---右键---索引/键---需要修改的列----是唯一的----忽略重复键 代码方式: cid varchar (20) ...
- Magento中,调用静态块的几种方法
在后台创建一个order_form静态块Block Title :Order FormIdentifier :order_formStatus :EnabledContent :自定义内容 1.如果要 ...
- 第一个Sprint冲刺第四天
讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:掌握计时技术的知识 讨论地点:qq网络 进展:即将开始对计时技术代码的编写
- 第一个Sprint冲刺第三天
讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:如何将新学的技术应用于四则运算项目中 讨论地点:宿舍 进展:跟预期相差不远
- 多层CCLayer的touch冲突解决
一般通过layer. setTouchPriority()方法来设置 touch优先级,数值越小,优先级越高,但有时多人开发过程中,多层layer叠在一起,无法通过setTouchPrority()来 ...