知识点:
1.串:
关于串的学习,我最大的收获是理解了KMP算法(解决串的模式匹配问题)和了解了Manacher算法(解决求字符串最长回文问题)。
在这一过程中,我常惊叹算法的巧妙,感慨前人的智慧结晶,以下是我对这两种算法的理解:
(1)KMP算法:
这里就不贴代码了,就说说它的实现原理。具体可以看这里利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
主串和模式串匹配到某一个位置发现 主串中1的部分和模式串中2部分不匹配时,
模式串就会移动一定的位置,如下图:
那么我们该移动多少呢?
我们继续往下看,上下这两个字符串分别是原来模式串的位置,和移动后模式串的位置。
能够这样移动的前提是保证 A == B,原来的匹配点截至到了1和2(即d)部分,
模式串移动之后匹配点就变成了1和c部分的比较。
为了能够实现KMP算法中模式串的移动,需要引入一个next[ ]数组。
next[ ] 存放已匹配子串中最长前后缀长度
以红色部分c为例子:
已匹配的子串:abaab → 最长前后缀ab 长度为2
KMP算法应用:PowerString问题(求字符串的最小周期)
(2)Manacher算法(马拉车算法):
2.数组:
至于数组的学习,最大的收获和成就就是理解了十字链表的原理和操作过程,并成功将以实现。
以下博客已经写得挺详细的了,就不再重复声明:
编程时遇到的困难:
1.利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
总结及学习心得:
在作业和实践的题目中,我都选择了相对来说困难的完成方式,这对我来说是一种得到锻炼和学习的最好方式。
纵使过程很痛苦,熬了大半个星期的夜,幸运的是结果还算是差强人意。
——林子里有两条路,我选择了行人稀少的那一条,它改变了我的一生。(《未选择的路》)
目标:
保持当前的学习热情,高要求严格自己,学习更多更巧妙的算法。