算法 · 2024年1月9日 0

算法之字符串查找

LeetCode之实现IndexOf

 

声明

博客中关于算法截图,来自七月算法PPT,bilibili地址 博文涉及代码地址:码云

原题

在这里插入图片描述

解题思路

暴力法

在这里插入图片描述

KMP算法

算法说明

  1. kmb算法解释
  2. kmb核心算法 next() 看完想法:next()函数作用,就是求前缀和后缀是否重复部分,有重复的时候,在平移的时候要考虑

算法实现

总结: 结果并不是太理想,我都不好意思贴leetcode运行结果了,消耗的空间和时间都非常的多,空间消耗比较多,主要再subString()方法会重复new对象,这里可以优化,但是就算我优化了,也是需要遍历,时间复杂度又提升 疑问:KMP真的有那么优秀,再我看来,KMP真的不如BF算法,假设没有不考虑求next数组的时间复杂度,KMP确实M+N的复杂度,但是求next数组应该是M*M(非专业,大概计算,不会推到)级别的 最后求大佬指点,哪里不对,哪里还有可以优化

自己优化next函数

  1. 不使用substring方法,自己写方法实现同样的效果,结果空间复杂度确实降下来了,时间复杂度依旧没降下来,测试差不多

百度到next优化

三种next 时间测试结果

在这里插入图片描述

  1. 这里就多解释,百度的到时候复杂度是O(N) 级别的

BM算法

算法说明

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 感受: 个人觉得BF算法比KMP算法好理解多了,KMP最难理解就是next函数

算法实现

leetcode执行结果

在这里插入图片描述