KMP板子

get_fail

//get_fail 意味着包括当前字母,前缀和后缀的最大匹配
vector<int> pf;
void kmp(string s) {
	pf.resize(s.size());
	for(int j=1; j<s.size(); ++j) {
		int k=pf[j-1];
		while(s[k]!=s[j]) {
			if(!k) {
				k=-1;
				break;
			}
			k=pf[k-1];
		}
		pf[j]=k+1;
	}
}

get_next

const int maxn=1e5+5;
int Next[maxn];
void better_Getnext(string p)//优化以后的
{
    int pLen=p.size();
    Next[0]=-1;
    int k=-1;
    int j=0;
    while(j<pLen-1)
    {
        if(k==-1 || p[j]==p[k])
        {
            ++j;++k;
            if(p[j]!=p[k])
                Next[j]=k;
            else 
            {
                Next[j]=Next[k];
            }
        }else{
            k=Next[k];
        }
    }
}
int KmpSearch(string s,string p)//匹配函数
{
    int i=0;
    int j=0;
    int sLen=s.size();
    int pLen=p.size();
    while(i<sLen && j<pLen)
    {
        if(j==-1 || s[i]==p[j])
        {
            i++;j++;
        }else{
            j=Next[j];
        }
    }
    if(j==pLen)//找到就返回找到的位置
        return i-j;
    else return -1;//没找到返回-1
}

//没有优化的
void get_next(char s[])
{
	int len=strlen(s);
	a[0]=-1;
	for(int i=0;i<len;i++)
	{
		int j=a[i];
		while(j!=-1 && s[i]!=s[j] ) j=a[j];
		a[i+1]=j+1;
	}
	return ;
}
发布了18 篇原创文章 · 获赞 9 · 访问量 882

猜你喜欢

转载自blog.csdn.net/weixin_42859385/article/details/99297378
kmp
今日推荐