kmp--考研写法

首先是模式串匹配:

#include<iostream>
#include<stdlib.h>
using namespace std;
#define maxn 1000000
struct str
{
    char *ch;
    int length;
}a,b;
int lower(str a, str b)
{
   
    int i=1,j=1;
    int k=0;
    
    while(i<=a.length&&j<=b.length)
    {
        if(a.ch[i]==b.ch[j])
        {
            i++;
            j++;
        }
        else
        {
            i=++k;
            j=1;
        }
    }
    if(j>b.length)
        return k;
    else
        return 0;
    
    
}
int main()
{

    cin>>a.length;
    a.ch=(char*)malloc((a.length+1)*sizeof(char));
    for(int i=1;i<=a.length;i++)
        cin>>a.ch[i];
    cin>>b.length;
    b.ch=(char*)malloc((b.length+1)*sizeof(char));
    for(int i=1;i<=5;i++)
        cin>>b.ch[i];
    if(lower(a,b)!=0)
    cout<< lower(a, b)<<endl;
    else
        cout<<"no match"<<endl;
    free(a.ch);
    free(b.ch);
        
    return 0;
}

malloc : 

数组=(类型*)malloc(数组大小*sizeof(类型));

free(数组);

例如:

 a.ch=(char*)malloc((a.length+1)*sizeof(char));
 free(b.ch);

为什么不用2个for。然后不匹配break呢?
因为更好改kmp,而且更防止老师眼睛一累以为你瞎搞,批错了了。

然后 这个算法的复杂度是o(m^n);

我们需要一个更快的算法——kmp

 我们来看一个例子:例子别的博主那里偷一下吧。没时间自己画图。哈哈哈

 
 

猜你喜欢

转载自www.cnblogs.com/2014slx/p/11105833.html
kmp
今日推荐