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

KMP算法的一次理解(上)

时间:2015-03-18 23:00:13      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

在一个大的字符串中对一个小的子串进行定位成为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了。


问题描述:

有一个文本串s和一个模式串p,现在要查找p在s中的位置,怎么查找?

如果用暴力匹配的思路,并假设文本串匹配到i位置,模式串匹配到j位置。


算法描述:

有关字符串的模式匹配,首先来看最简单的一个算法,那就是暴力法。具体的算法描述:

(1)初始化i指向主串的初始位置,这里假设是主串的0位置;j指向子串的0位置。

(2)若当前字符匹配成功,也就是s[i] == p[j],则i++,j++,继续匹配下一个字符串。

(3)如果匹配不成功,也就是s[i] != p[j],则i = i-j+1,j=0。相当于每次匹配失败时,i回溯,j重置为0。

在不成功匹配的时候,i是本次匹配后主串的指标,那么比较匹配开始前的位置移动的量为j。所以i-j是本次匹配的起始位置。+1代表向后移动一个位置。

代码实现:

//返回子串p在主串s中的位置,如果不存在就返回-1
int ViolentMatch(char *s, char *p)
{
    int i = 0;
    int j = 0;
    int sLen = strlen(s);
    int pLen = strlen(p);

    while(i < sLen && j < pLen)
    {
        if(s[i] == p[j])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i - j + 1;//j代表这一次移动的次数,i-j表示s串的本次的起始位置,+1表示前进一个位置
              j = 0;
        }
    }//while

    if(j == pLen)
    {
        return i - pLen ;
    }
    else
    {
        return -1;
    }
}

这种暴力的匹配算法的时间复杂度在最坏的情况下为O[(n-m+1)*m],其中n为主串的长度,m为模式串的长度。可以看出算法的时间复杂度很大,显然我们不需要这样的算法,因为它很烂。但是这是我们设计其它算法的基础。

KMP算法的一次理解(上)

标签:

原文地址:http://www.cnblogs.com/stemon/p/4348714.html

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