题目描述
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
Sunday算法
这是一道字符串匹配的常见题型,常规算法两个for循环解决;但是,除了KMP这种不太容易手撕的算法外,Sunday算法可以说是一种非常容易理解和实现的算法。
1 | class Solution { |
算法思想
从前往后匹配,每次匹配过程的末尾的下一位去检查该字符是否存在于模式串中:
若存在于模式串中,则返回
i
的移动步数move=
模式串长度-
所在字符的位置最后一个出现位置若不存在,则
move
=模式串长度+
1
算法本身其实很容易理解,主要在实现查询办法时需要注意,每次去模式串中查找某个字符效率会比较低下,且算法设计很冗余,较好的办法可以如上述代码,设计一个大小为256
的数组,用于存储每个字符的移动步数,这样检索时不会有重复检索问题,效率会高不少。
缺点
缺点很明显,主要有两点:
即已经匹配的部分字符串完全没有利用,被浪费。
Sunday
算法的效率受到匹配串和模式串的影响。主串:baaaabaaaabaaaabaaaa
模式串:aaaaa
这个模式串使得move[a]的值为1,即每次匹配失败时,只让模式串向后移动一位再进行匹配。这样就让Sunday算法的时间复杂度飙升到了
O(m*n)
,即字符串匹配常规情况。
此外,不得不吐槽的是,Leetcode
官方认为这道题时简单题,给出的数据完全对Sunday算法不利,反而常规算法这道题效率更高。