查找字符串是我们平常编程过程中经常遇到的,现在介绍一种查找字符串算法,增加程序的执行速度。

通常我们是这么写的:

/*
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 算法的更多相关文章

  1. 子字符串查找之————关于KMP算法你不知道的事

    写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...

  2. 字符串模式匹配KMP算法

    一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...

  3. 字符串类——KMP算法的应用

    1,字符串类中的新功能(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述函数实现原理): 2,子串查找(KMP 算法直接运用): 1,int indexOf(const char* s) ...

  4. [Algorithm] 字符串匹配算法——KMP算法

    1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串& ...

  5. 字符串匹配算法——KMP算法

    处理字符串的过程中,难免会遇到字符匹配的问题.常用的字符匹配方法 1. 朴素模式匹配算法(Brute-Force算法) 求子串位置的定位函数Index( S, T, pos). 模式匹配:子串的定位操 ...

  6. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  7. 字符串匹配算法-kmp算法

    一原理: 部分转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字 ...

  8. 字符串匹配算法KMP算法

    数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...

  9. 数据结构4.3_字符串模式匹配——KMP算法详解

    next数组表示字符串前后缀匹配的最大长度.是KMP算法的精髓所在.可以起到决定模式字符串右移多少长度以达到跳跃式匹配的高效模式. 以下是对next数组的解释: 如何求next数组: 相关链接:按顺序 ...

随机推荐

  1. checkbox的全选、反选、删除(MainActivity)

    package com.example.ay; import java.util.ArrayList;import java.util.List; import com.example.adapter ...

  2. Javascript 基础--数组

    一.一维数组 1.一维数组 var weights = [3,5,1,3.4,2,50]; var all_weight=0; var avg_weight=0; for(var i=0;i<w ...

  3. C++ primer的第二章的主要内容

    这第二章主要是介绍了C++中基本的内置数据类型:整型与浮点型.介绍了什么是变量的过程中了解到了左值与右值的概念.左值是可以出现在赋值语句的左边或者右边,也就是说可以放在等号的左右两边,而右值只能是出现 ...

  4. stm32的串口接收字符串以十六进制数

      #include "pbdata.h"   uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 ...

  5. js控制打印 转的

    很多时候,我们在做系统的时候要做打印功能,打印在js中其实很简单,不过这个很简单的代码并不能满足我们的特定需求,比如我们需要打印的表单在很多文字的中间,或者文字中包含一些广告或者图片什么的,这就很难用 ...

  6. sphinx 全配置

    ## 数据源src1 source src1 { ## 说明数据源的类型.数据源的类型可以是:mysql,pgsql,mssql,xmlpipe,odbc,python ## 有人会奇怪,python ...

  7. BZOJ 3251 树上三角形

    NOIP的东西回成都再说吧... 这题暴力. #include<iostream> #include<cstdio> #include<cstring> #incl ...

  8. PHP图像处理之在原图像处理

    处理原有的图像        图片处理,缩放,裁剪,翻转,旋转,透明,锐化等图片操作        一.创建图片资源            imagecreatetruecolor(width,hei ...

  9. PHP面向对象中常用的关键字和魔术方法

    PHP面向对象中常用的关键字 final        1.final不能修饰成员属性(类中常量不是用这个关键字)        2.final只能修饰类和方法 作用:            使用fi ...

  10. Asp.Net请求管道中的19个事件

    请求管道中的19个事件.(1)BeginRequest: 开始处理请求(2)AuthenticateRequest授权验证请求,获取用户授权信息(3):PostAuthenticateRequest获 ...