码迷,mamicode.com
首页 > 编程语言 > 详细

查找字符串的 KMP 算法

时间:2015-02-01 01:49:58      阅读:157      评论:0      收藏: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 = 0;
    headPoint = sourcestr;
    moveSource = sourcestr;
    moveTarget = targetstr;
    while(*headPoint != *moveTarget)
            headPoint++;
    moveSource = headPoint;
    while(*moveSource != \0 && *moveTarget != \0) 
    {
        num++;
        moveSource++;
        moveTarget++;
        if(num == 3)
            break;
        while(*moveSource != *moveTarget)//-->kmp
        {
            headPoint = headPoint + 1;
            moveSource = headPoint;
            num = 0;
            moveTarget = targetstr;
        }    
    }
    printf("%s\n", headPoint);
}

int main()
{
    char *source = "mabveacabiabcy";
    char *target = "abc";
    char *sourcestr;
    char *targetstr;
    sourcestr = (char *)malloc(15 * sizeof(char));
    targetstr = (char *)malloc(4 * sizeof(char));
    memset(sourcestr, \0, 15 * sizeof(char));
    memset(targetstr, \0, 4 * sizeof(char));
    strncpy(sourcestr, source, 15);
    strncpy(targetstr, target, 4);
    compare(sourcestr, targetstr);
    return 0;
}

 

现在把函数  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 = 0;
    headPoint = sourcestr;
    moveSource = sourcestr;
    moveTarget = targetstr;
    while(*headPoint != *moveTarget)
            headPoint++;
    moveSource = headPoint;
    while(*moveSource != \0 && *moveTarget != \0) 
    {
        num++;
        moveSource++;
        moveTarget++;
        if(num == 3)
            break;
        while(*moveSource != *moveTarget)//-->kmp
        {
            if(num > 0)
                headPoint = headPoint + num;
            else
                headPoint = headPoint + 1;
            moveSource = headPoint;
            num = 0;
            moveTarget = targetstr;
        }    
    }
    printf("%s\n", headPoint);
}

int main()
{
    char *source = "mabveacabiabcy";
    char *target = "abc";
    char *sourcestr;
    char *targetstr;
    sourcestr = (char *)malloc(15 * sizeof(char));
    targetstr = (char *)malloc(4 * sizeof(char));
    memset(sourcestr, \0, 15 * sizeof(char));
    memset(targetstr, \0, 4 * sizeof(char));
    strncpy(sourcestr, source, 15);
    strncpy(targetstr, target, 4);
    compare(sourcestr, targetstr);
    return 0;
}
View Code

 

查找字符串的 KMP 算法

标签:

原文地址:http://www.cnblogs.com/lweleven/p/kmp.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!