一个kmp算法板子题的思考

今天学到的是kmp算法,之前学过一次了,但是使用的不是很熟练,容易卡在next数组的灵活运用,而这个数组是算法的精髓,在于减少匹配次数从而得到降低算法时间复杂度的效果。

kmp算法基本框架

char s[N],p[N];
int nex[M];
int n = strlen(s+1),m = strlen(p + 1);
nex[0] = nex[1] = 0;
for(int i=2,j=0;i<=m;i++)
{
    while(j && p[i]!=p[j + 1])j=nex[j];
    if(p[i]==p[j+1])j++;
    nex[i] = j;
}

本题是该算法的一个简单运用,即为模式串在文本串中出现的次数,通过计算nex数组,找到模式串的最长前缀和后缀的公共长度。初始化一个变量ans,用于记录模式串在目标串中出现的次数。遍历目标串的每个字符,依次和模式串进行比较。在比较过程中,维护一个指针j,用于指示已匹配的模式串的最后一个字符位置。如果当前字符匹配成功,则将指针j向后移动一位。如果指针j的值等于模式串的长度m,说明已经匹配成功,此时将ans增加1,并将指针j回溯到nex[j]的位置,继续向前匹配,最后,遍历完整个目标串后,输出最终的结果ans,即模式串在目标串中出现的次数。

以下为原题链接:https://www.lanqiao.cn/problems/2047/learning/?page=1&first_category_id=1&problem_id=2047&sort=difficulty&asc=0

你可能感兴趣的:(算法)