字符串模式匹配——给定两个字符串,主串 haystack,模式串 needle。在 haystack 中查找 needle 出现的首字符位置。
示例:
输入:haystack="hello",needle="ll" 输出:2
"ll" 在“hello”中出现的首字符位置是第三个字符,下标是 2
暴力的简单匹配
思想是,在 haystack 的每个位置,都检查一遍是不是 needle 的首字符,即后续能不能和 needle 匹配上。
使用两层循环很简单,时间复杂度是 O(len_h*len_n),显然过于复杂。
简单匹配的优化方向
既然要优化,我们肯定要知道原来的算法到底在哪里浪费了性能。可以看下面的例子:
haystack="abcabcabe" needle="abcabe"
跟着简单匹配的思路,以 haystack[0] 为起点,然后主串模式串同时向后移动并匹配每一位,我们可以发现最终匹配会停留在:
- abcab
c
abe - abcab
e
即 c 和 e 匹配失败,那么简单匹配会退出这轮子循环,再以 haystack[1] 进行匹配。
此时以人的思维去看,以 b 或 c 为起点肯定匹配不成功,相反
abcab
cabe 和ab
cabe 是显然可以匹配到的。
而且从遍历的角度来看,主串已经走到了 haystack[5],相当于我们已经获取了前 6 位字符的信息了,我们已经知道前 6 位是什么字符了,再从 haystack[1] 开始的话就相当于刚见过人家长啥样就忘了,没有利用到已知信息,这就是问题所在。