字符串匹配--sunday 算法
听说这个算法比kmp效率还高,而且重要的是还好理解,所以就.....
这个例子中上面的字符串是待查找字符串,下面的是子串。sunday的思想是这样的:
好了,sunday算法还真的很好理解,用下面的例子来说明吧:
j | k | ||||||||||||||||||
t | h | i | s | i | s | a | s | i | m | p | l | e | e | x | a | m | p | l | e |
e | x | a | m | p | l | e | |||||||||||||
i |
首先i,j两个指针指示的位置(也就是从头开始匹配),当发现失配的时候就判断子串的后一位在母串的字符(在上面的例子中是s,k标记处)是否在子串中存在?如果存在则将该位置和子串中的该字符对齐,在从头开始匹配。如果不存在就将子串向后移动,和母串k+1处的字符对齐,再进行匹配。重复上面的操作直到找到,或母串被找完结束。
对于上面的例子继续进行,刚才说了失配,并且s在子串中不存在,所以子串向后移动,子串的第一个字符和母串的k+1位置的字符对齐,如下图:
j | k | ||||||||||||||||||
t | h | i | s | i | s | a | s | i | m | p | l | e | e | x | a | m | p | l | e |
e | x | a | m | p | l | e | |||||||||||||
j |
这次比较还是失配,但是k位置的a在子串中出现了,而且第3个就是(如果有多个匹配的,这时候一定要将子串中靠后出现的a和母串中的a对齐)如下图,匹配成功:
j | |||||||||||||||||||
t | h | i | s | i | s | a | s | i | m | p | l | e | e | x | a | m | p | l | e |
e | x | a | m | p | l | e | |||||||||||||
i |
C++语言实现查看本人文章:leetcode28