数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第nextj的继续往后匹配

求模式串的next数组(手算)

next1

任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next1都无脑写0

next2

任何模式串都一样,第二个字符不匹配时,只能匹配模式串的第1个字符,因此,往后,next1都无脑写1

next3

在不匹配的位置前边,划一条分界线,模式串一步一步往后退,直到分界线之前"能对上",或模式串能完全跨过分界线为止,此时j指向哪儿,next数组值就是多少

next4

在不匹配的位置前边,划一条分界线,模式串一步一步往后退,直到分界线之前"能对上",或模式串能完全跨过分界线为止,此时j指向哪儿,next数组值就是多少

next5

在不匹配的位置前边,划一条分界线,模式串一步一步往后退,直到分界线之前"能对上",或模式串能完全跨过分界线为止,此时j指向哪儿,next数组值就是多少

next6

在不匹配的位置前边,划一条分界线,模式串一步一步往后退,直到分界线之前"能对上",或模式串能完全跨过分界线为止,此时j指向哪儿,next数组值就是多少

总结

next1都无脑写0

next2都无脑写1

**其他next:**在不匹配的位置前边,划一条分界线,模式串一步一步往后退,直到分界线之前"能对上",或模式串能完全跨过分界线为止,此时j指向哪儿,next数组值就是多少

例题:

求模式串:ababaa的next数组

//求next1

??????->??????//i=1->i=2

ababaa-> ababaa //j=0,第一个字符匹配失败,只能匹配下一个子串,++i,++j

next1=0;
//求next2

a**?** ????->a?????? //i=2

ababaa-> ababaa //j=1//第一个字符匹配成功,第二个字符匹配失败,i不动,j后退一步

next2=1;
//求next3

ab????->ab????//i=3

ababaa-> ababaa//第三个字符匹配失败,模式串后退两步,j指向1,j=1

next3=1
//求next4

aba???->aba???//i=4

ababaa-> ababaa//第四个字符匹配失败,模式串后退,第一个字符a和主串第三个字符a匹配,j指向2,j=2

next4=2
//求next5

abab??->abab??//i=5

ababaa-> ababaa//第五个字符匹配失败,模式串后退,字符串ab和主串第二个子串ab匹配,j指向3,j=3

next5=3

//求next6

ababa?->ababa?//i=6

ababaa-> ababaa//第六个字符匹配失败,模式串后退,字符串ab和主串第二个子串aba匹配,j指向4,j=4

next6=4

例题2同理:

相关推荐
To_OC3 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安8 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者11 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
北域码匠14 小时前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
kisshyshy17 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC1 天前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法