KMP字符串模式匹配

1.描述:指针i不回溯的字符串模式匹配算法

#include <iostream>
#include<cstring>
using namespace std;

/**
名称:计算next数组函数
描述:用于计算KMP模式匹配算法的next数组。该方法已得到修正,可以避免连续相同元素的问题
编写人:李一帆
时间:2021.2.3
参数:patternString 模式串
参数:nextArray next数组
返回值:null
**/
void getNextArray(char* patternString,int* nextArray){
    int i=0;
    int j=-1;
    nextArray[0]=-1;
    while(i<strlen(patternString)){
        if(j==-1||patternString[i]==patternString[j]){
            i++;
            j++;
            if(patternString[i]!=patternString[j]) nextArray[i]=j;
            else nextArray[i] = nextArray[j];
        }else{
            j= nextArray[j];
        }
    }
}

/**
名称:KMP模式匹配
描述:用于字符串的模式匹配问题
编写人:李一帆
时间:2021.2.3
参数:mainString 主串
参数:patternString 模式串
参数:nextArray next数组
返回值:int -1:不匹配;其余:子模式的首下标
**/
int patternMathcingKMP(char* mainString,char* patternString,int* nextArray){
    int i = 0;
    int j = 0;
    while(i<strlen(mainString)&&j<strlen(patternString)){
        if(j==-1||mainString[i]==patternString[j]){
            i++;j++;
        }else{
            j = nextArray[j];
        }
    }
    if(j==strlen(patternString)){
        return i - j;
    }else{
        return -1;
    }
}

int main()
{
    char* mainString = "ababcabcacbab";
    char* patternString = "abcac";
    int* nextArray =new int[100];
    getNextArray(patternString,nextArray);
    int pos = patternMathcingKMP(mainString,patternString,nextArray);
    cout<<pos;
    return 0;
}
原文地址:https://www.cnblogs.com/fangexuxiehuihuang/p/14368036.html