KMP字符串查找

kmp查找首先要创建next数组

next数组中装的是最大前缀和后缀相等的数量

然后进行KMP查找,代码如下

int KMP(char* str,int length1,char* arr,int length2)
{
    if(str == NULL || arr == NULL || length1 <= 0 || length2 <= 0) return -1;
    //创建next数组
    char* pNext = (char*)malloc(sizeof(char)*length2);
    memset(pNext,0,sizeof(char)*length2);
    int j;
    for(int i=1;i<length2;i++)
    {
        //如果这个元素和他应该比较的元素相等
        if(arr[pNext[i-1]] == arr[i])
        {
            pNext[i] = pNext[i-1]+1;
        }

        //如果不相等,再向前找,直到找到pNext[0]
        else
        {
            j = pNext[i-1];
            while(j != 0 && arr[pNext[j-1]] != arr[i])
                j = pNext[j-1];

            //判断循环跳出的条件
            if(j == 0)
            {
                if(arr[0] != arr[i])
                    pNext[i] = 0;
                else
                    pNext[i] = 1;
            }
            else
                pNext[i] = pNext[j-1]+1;

        }
    }
    //遍历
    //index是小字符串的下标
    int index = 0;
    int i;
    for(i=0;i<length1;i++)
    {
        //如果相等两个指针一起向后移动
        if(str[i] == arr[index])
        {
            index++;
            if(index == length2)
                break;
        }
        else
        {
            //调整第二个指针的位置
            while(index != 0 && str[i] != arr[index])
            {
                index = pNext[index-1];
            }
            //向前找到匹配的
            if(str[i] == arr[index])
                index++;
        }
    }

    return i-index+1;


}

猜你喜欢

转载自www.cnblogs.com/TheQi/p/9151965.html