字符串KMP以及暴力求解

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值