String KMP and brute force solution

#include <iostream>
#include <string.h>
using namespace std;
int net[100];
int lens;
int lent;
int Index(char S[],char P[])//朴素的串匹配算法,即暴力求解;
{
//返回子串P 在主串S 中的位置
    int i = 1;
    int j = 1; // i 和j 也可能从0 开始,依赖于存储设计
    while (i <= lens && j <=lent)
    {
        if (S[i]==P[j])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i-j+2;
            j = 1;
        }
    }
    if ( j>lent )
        return (i-lent); //匹配成功
    return -1; //匹配失败
} // Index
int Index_KMP (char S[],char T[],int pos) //模式匹配算法--KMP 算法
{
//返回子串T 在主串S 中从第pos 个字符开始的位置
//要求T 非空,1≤pos ≤Strlength(S)
    int i=pos;
    int j=1;
    while(i<=lens && j<=lent)
    {
        if (j==0|| S[i]==T[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j=net[j];
        }
    }
    if (j> lent)
        return (i-lent);
    return 0;
}
void Get_Index(char T[], int net[])// KMP 模式匹配算法---求next[j]的算法:
{
//求模式串T 的next 函数值并存入数组next
    int i = 1;
    net[1] = 0;
    int j = 0;
    while( i <= lent)
    {
        if ( j==0 || T[i]==T[j])
        {
            ++i;
            ++j;
            net[i] = j;
        }
        else
            j = net[j];
    }
} // Get_Index
int main()
{
    char t[100] = " abaabcac";//书上所给代码,下标从1开始,且程度8,即在t中1-8是有字符的;
    char s[100] = " acabaabaabcacaabc";
    lens = strlen(s)-1;
    lent = strlen(t)-1;
    Get_Index(t, net);
    printf("s = %d p = %d\n", lens, lent);
    for(int i=1; i<=lent; i++)
    {
        printf("%d ", net[i]);
    }
    printf("\n");
    int e = Index(s, t);
    printf("暴力求解:%d\n", e);
    e = Index_KMP(s, t, 1);
    printf("KMP求解:%d\n", e);
    return 0;
}

 

Guess you like

Origin blog.csdn.net/weixin_42137874/article/details/110295898