KMP,BF,STL之find函数,三种路径,分析如何进行模式串匹配(1)

本文详细介绍了KMP算法,包括两种C++代码实现,展示了如何使用next数组优化模式串在主串中的查找过程,以及算法的时间复杂度和应用背景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS:这是最好理解的一种

KMP算法模式串匹配(模式串下标从0开始):

#include<stdio.h>

#include<string.h>

int main()

{

char s1[110];

char s2[110];

printf(“请输入两行字符串,分别表示主串和模式串:\n”);

while(~scanf(“%s%s”,s1,s2))

{

int next[110];

next[0]=-1; //由于书上的字符串是以1开头所以next[0]=0,而我是以0开头,所以next[0]=-1,至于为啥,我觉得自己手动算下应该就明白了

int i=0;

int j=-1; //重点!!!!!

int len1=strlen(s1);

int len2=strlen(s2);

while(i<len2)

{

if(j==-1||s2[i]s2[j]) //由于next[0]=-1,所以对j-1特判下

{

++i;

++j;

next[i]=j;

}

else

{

j=next[j];

}

}

i=0;

j=0;

while(i<len1&&j<len2)

{

if(s1[i]s2[j]||j-1) //同样由于next[0]=-1的存在

{

++i;

++j;

}

else

{

j=next[j]; //这里就不需要指针回溯,大大降低了时间复杂度

}

}

if(j==len2)

{

printf(“%d\n”,i-len2+1);

}

else

printf(“0\n”);

}

return 0;

}

KMP算法模式串匹配:

// KMP算法模式串匹配

#include <bits/stdc++.h>

using namespace std;

int main()

{

char a[105];

char b[1005];

memset(a, ‘\0’, sizeof(a));

memset(b, ‘\0’, sizeof(b));

while (~scanf(“%s%s”, a, b))

{

int next[105] = {0};

scanf(“%s%s”, a, b);

int i = 1, j = 0;

while (i < strlen(a))

{

if (a[i] == a[j])

next[i++] = ++j;

else

{

if (j > 0)

j = next[j - 1];

else

i++;

}

}

for (int i = 0; i < strlen(a); ++i)

printf("%d ", next[i]);

printf(“\n”);

i = 0;

j = 0;

while (i < strlen(b))

{

if (a[j] == b[i])

{

++i;

++j;

if (j == strlen(a))

{

printf(“%d\n”, i - j);

j = next[j - 1];

}

}

else

{

if (j > 0)

j = next[j - 1];

else

++i;

}

}

memset(a, ‘\0’, sizeof(a));

memset(b, ‘\0’, sizeof(b));

}

return 0;

}

KMP算法模式串匹配(模式串下标从1开始):

#include <bits/stdc++.h>

using namespace std;

const int cmax = 1e3 + 5;

char str[cmax];

int nex[cmax];

char t[cmax];

void get_next(char T[])

{

int i = 1, j = 0, len = strlen(T) - 1;

nex[1] = 0;

while (i < len)

{

if (j == 0 || T[i] == T[j])

{

++i;

++j;

nex[i] = j;

}

else

j = nex[j];

}

}

int Index_KMP(char s[], char t[], int pos)

{

int i = pos, j = 1, slen = strlen(s) - 1, tlen = strlen(t) - 1;

while (i <= slen && j <= tlen)

{

if (j == 0 || s[i] == t[j])

{

i++, j++;

}

else

j = nex[j];

}

if (j > tlen)

return i - tlen;

else

return 0;

}

int main()

{

memset(str, ‘\0’, sizeof(str));

memset(nex, 0, sizeof(nex));

memset(t, ‘\0’, sizeof(t));

scanf(“%s%s”, t, str);

for (int i = strlen(str) - 1; i >= 0; i–)

str[i + 1] = str[i];

for (int i = strlen(t) - 1; i >= 0; i–)

t[i + 1] = t[i];

get_next(str);

int flag = Index_KMP(t, str, 1);

printf(“%d\n”, flag);

memset(nex, 0, sizeof(nex));

return 0;

}

BF算法模式串匹配:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

题外话

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-y1wz6w3C-1712659833612)]

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值