KMP算法

//KMP模式匹配算法
void get_next(string T, int* next)   //计算出当前要匹配的串next数组
{
    int i, j;
    i = 1;
    j = 0;
    next[1] = 0;
    while (i < T[0])   //此处T[0]表示串T的长度
    {
        if (j == 0 || T[i] == T[j])   //T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
            j = next[j];  //若字符不相同,则j值回溯
    }
}
int Index_KMP(string S, string T, int pos)
{
    int i = pos;  //i用于主串S中当前位置下标,若pos不为1,则从pos位置开始匹配
    int j = 1;  //j用于子串T中当前位置下标值
    int next[255];  //定义一个next数组
    get_next(T, next);   //对串T作分析,得到next数组
    while (i <= S[0] && j <= T[0])  //若i小于S长度且j小于T的长度时循环
    {
        if (j == 0 || S[i] == T[j])  //两字母相等则继续,与朴素算法增加了j=0判断
        {
            ++i;
            ++j;
        }
        else  //指针后退重新开始匹配
        {
            j = next[j];  //j退回合适的位置,i值不变
        }
    }
    if (j > T[0])
        return i - T[0];
    else
        return 0;
}

//KMP模式匹配改进算法
void get_nextval(string T, int* nextval)   //计算出当前要匹配的串next数组
{
    int i, j;
    i = 1;
    j = 0;
    nextval[1] = 0;
    while (i < T[0])   //此处T[0]表示串T的长度
    {
        if (j == 0 || T[i] == T[j])   //T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
        {
            ++i;
            ++j;
            if (T[i] != T[j])  //若当前字符与前缀字符不同
                nextval[i] = j;  //则当前的j为nextval在i位置的值
            else
                nextval[i] = nextval[j];  //如果与前缀字符相同,则将前缀字符的nextval值赋给nextval在i位置的值
        }
        else
            j = nextval[j];  //若字符不相同,则j值回溯
    }
}
int Index_KMP(string S, string T, int pos)
{
    int i = pos;  //i用于主串S中当前位置下标,若pos不为1,则从pos位置开始匹配
    int j = 1;  //j用于子串T中当前位置下标值
    int next[255];  //定义一个next数组
    get_nextval(T, next);   //对串T作分析,得到next数组
    while (i <= S[0] && j <= T[0])  //若i小于S长度且j小于T的长度时循环
    {
        if (j == 0 || S[i] == T[j])  //两字母相等则继续,与朴素算法增加了j=0判断
        {
            ++i;
            ++j;
        }
        else  //指针后退重新开始匹配
        {
            j = next[j];  //j退回合适的位置,i值不变
        }
    }
    if (j > T[0])
        return i - T[0];
    else
        return 0;
}

你可能感兴趣的:(算法)