字符串
KMP:
/* 时间复杂度:如果文本串的长度为 n,模式串的长度为 m,那么匹配过程的时间复
杂度为 O(n),算上计算 next 的 O(m)时间,KMP 的整体时间复杂度为 O(m + n)。*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/* 功能: 获取 next 数组的值:计算目标串前后缀相同的字符个数
输入: ttr:目标串(下标从 0 开始)tlen:目标串长度
next:目标串的最长前缀和最长后缀相同的长度
*/
void Get_Next(char *ttr,int *next,int tlen)
{
next[0]=-1; // next[0] 初始化为-1-1 表示不存在相同的最大前缀和最大后缀
for(int i=1,j=-1;i<tlen;i++)
{
while(j>-1 && ttr[j+1]!=ttr[i]) // 如果下一个不同,那么 j 就变成 next[j],
注意 next[j] 是小于 j 的,无论 j 取任何值
j=next[j]; // 往前回溯
if(ttr[j+1]==ttr[i]) // 如果相同,j++
j++;
next[i]=j;//这是把算好的 j 值(就是相同的最大前缀和最大后缀长度)赋给
next[i]
}
}
/* 功能: 在主串中匹配目标串;
输入: str:主串(下标从 0 开始)slen:主串长度
ttr:目标串(下标从 0 开始) tlen:目标串长度
输出:若存在,返回第一个字符匹配成功的位置(下标从 0 开始);否则,返回-1
*/
int Index_KMP(char *str,int slen,char *ttr,int tlen)
{
int *next=new int[tlen];
Get_Next(ttr,next,tlen);
for(int i=0,j=-1;i<slen;i++)
{
while(j>-1 && ttr[j+1]!=str[i]) // ttr 和 str 不匹配,且 j>-1:表示 ttr 和
str 有部分匹配
j=next[j]; // 往前回溯
if(ttr[j+1]==str[i])
j++;
if(j==tlen-1) // 说明 j 移动到 ttr 的最末端,匹配完成(成功)
评论0
最新资源