字符串匹配算法——Sunday
字符串匹配算法——Sunday
听到字符串匹配,我们第一想到的是经典的KMP算法,为什么会是它,因为它实在是太经典了。但是我们今天要讲的是另一个算法,Sunday算法,比KMP还要快的字符串匹配。
假设
匹配串src
为\(\quad\)abcabdaababcbab
模式串des
为\(\quad\)babcb
设匹配串的游标为i,模式串游标为j,模式串当前位于匹配串位置pos
当src[i] != des[j]
时,看abcabdaababcbab中的d,在模式串中不存在d,所以pos += len(des)
,变到d后面的a的位置,j=0
。
此时:
abcabdaababcbab
$\ \ \ \ \ \ \ \ \ \ \ $babcb
再看c是否存在于des
,存在。从右向左找到des
中第一个与c匹配的位置,并将des
与之对其:
abcabdaababcbab
$\quad\quad\quad\ $babcb
本例完成匹配。
Python代码如下:
def sunday(src, des):
len_src = len(src)
len_des = len(des)
pos = 0
while pos < len_src - len_des + 1:
i = pos
j = 0
# print src[i:]
# print des
for j in range(0, len_des):
if src[i] != des[j]:
if src[pos+len_des] in des:
pos += len_des
break
else:
index = des.rfind(src[pos+len_des])
pos += (len_des-index)
break
else:
i += 1
j += 1
if j == len_des:
return True
return False
def main():
src = "abcdaajisdfhcbbasbebbbsaecabbadd"
des = "bsaeca"
print sunday(src, des)
其实在Python里有内建的函数搞定字符串匹配:
print des in src