第八天| 28. 实现 strStr() 459.重复的子字符串

KMP算法理论基础

KMP算法是一种高效的字符串搜索算法,用于在一个较大的文本串中查找一个给定的模式串。 KMP算法的关键思想是通过利用先前匹配的信息来避免不必要的字符比较。它对模式串进行预处理,构建一个“next表”,这有助于确定在出现不匹配时从哪里继续匹配。

next数组的原理与代码实现:

原理以例子说明

文本串:aabaabaafa  模式串:aabaaf

1. 前缀:包含首字母(从首字母开始),且不包含末字母的所有子串。

    后缀:不包含首字母,且包含末字母(结尾在末字母)的所有子串。

2. next 数组的本质就是"以当前字母为结尾的字符串"的“最长相等前后缀”的长度。模式串:aabaaf 的next = [0, 1, 0, 1, 2, 0]

代码实现

定义两个变量 i, j。这里 j 是前缀的末尾,因此初始化为0;i 为后缀的末尾,初始化为1(因为长度为1的字符串没有前后缀,至少长度为2).

i 定位字符串末尾的位置。j 定位前缀末尾的位置(也就是最长相等前后缀的长度)。

当匹配时:最长相等前后缀长度 j 加一。更新next数组。

当不匹配时:比如前缀‘aab'和后缀‘aaf’ 前两位都配上了,但到'f'不匹配,此时 i = 5, j = 2。不匹配就找前一位的next数组的值 next[j-1] = 1, 代表j应该跳回到1, pattern[5]与pattern[1]还是不等。那就继续回退到j=0.

KMP算法的原理与代码实现:

文本串:aabaabaafa  模式串:aabaaf。next数组算出来为[0, 1, 0, 1, 2, 0]

变量 i, j:i 为文本串的当前位置,j 为模式串的当前位置。

当匹配时:匹配长度加一,然后继续看下一位 i,j 是否能接着配上。

当不匹配时:比如‘aabaa’都配上了,但到'f'不匹配,此时 j = 5, 应该看next数组的前一位Next[5-1] = 2,代表我们应该跳回到2。因为后缀aa与前缀aa一样,既然后缀aa的下一位配不上,就退回去看前缀的后一位能否配上。( 2 是前缀的长度,也是前缀后一位字符的index。)

28. 实现 strStr()

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

思路:KMP算法的一个简单应用,前面已经详述,这里就不赘述了。

459.重复的子字符串

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

思路:暴力解法就不做了,反正我也不会。这道题算是next数组的妙用。

比如'abcabcabc'对应的next数组为[0,0,0,1,2,3,4,5,6]。重复子串为‘abc’前三位next数组都为0。后面因为都是重复的,next数组值自增1。因此,字符串长度 - next数组的末位数即重复子串的长度。

那判断条件就是:1. 重复子串长度不能超过字符串的一半。2. 字符串的长度恰好是重复子串长度的倍数。

以下是卡哥资料

28. 实现 strStr()  (本题可以跳过)

因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。

或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。

因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有 算法基础和思维了,在看多看几遍视频,慢慢就理解了。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html

 459.重复的子字符串  (本题可以跳过)

本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。 

我的建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃

题目链接/文章讲解/视频讲解:https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html

字符串总结 

比较简单,大家读一遍就行 

题目链接/文章讲解:https://programmercarl.com/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%80%BB%E7%BB%93.html

 双指针回顾 

此时我们已经做过10到双指针的题目了,来一起回顾一下,大家自己也总结一下双指针的心得 

文章讲解:https://programmercarl.com/%E5%8F%8C%E6%8C%87%E9%92%88%E6%80%BB%E7%BB%93.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容