字符串匹配的三种算法

字符串匹配的三种算法

下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为O(mn),也就是暴力求解。这种方法比较简单,容易实现。一种是KMP算法,时间复杂度为O(m+n),该算法的主要任务是求模式串的next数组。另外还有一种对KMP算法的改进,主要是求nextval数组。

第一种朴素的匹配算法:

int index(char str[], char subStr[])
{
    int i = 0, j = 0,index = 0;
    while (str[i] != '\0' && subStr[j] != '\0')
    {
        //当前字符匹配,执行下一个字符
        if (str[i] == subStr[j])
        {
            i++; j++;
        }
        else
        {
            i = ++index;
            j = 0;
        }
    }
        //匹配成功
    if (j == strlen(subStr))
        return index;
    else
        return -1;
}

第二种算法KMP算法,求next数组,next[j]表示,当模式串j位置与主串i位置处发生不匹配时,i指针不回溯,j指针回溯到next[j]的位置。

对于求next[j]有三种情况:

1、j = 0时,next[j] = -1;//即模式串的第一个字符与主串i位置发生不匹配,应将i跳过当前位置,从下一个位置和模式串的第一个字符继续比较。

2、假设已知next[j] = k,即subStr[0,...,k-1] = subStr[j-k,j-1]。当subStr[k] = subStr[j]时,也就是说模式串满足subStr[0,...,k] = subStr[j-k,j],可以得知next[j+1] = k + 1 = next[j] + 1;

3、当subStr[k] != subStr[j]时,就需要从k位置之前去查找与subStr[j]匹配的位置,假设为j'。这样问题又可以转化为第二种情况,即next[j+1] = next[j'] + 1 = k' + 1。

 具体求解方法,请阅读http://www.cnblogs.com/tgycoder/p/4997067.html,文中给出了三种求解next数组的方法。

第三种算法是对KMP算法的一种优化,主要是求nextval数组。

posted on 2015-11-26 10:43  RunningSnail 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tgycoder/p/4996059.html

你可能感兴趣的:(字符串匹配的三种算法)