听到字符串匹配,咱们第一想到的是经典的KMP算法,为何会是它,由于它实在是太经典了。可是咱们今天要讲的是另外一个算法,Sunday算法,比KMP还要快的字符串匹配。python
假设
匹配串src
为\(\quad\)abcabdaababcbab
模式串des
为\(\quad\)babcb算法
设匹配串的游标为i,模式串游标为j,模式串当前位于匹配串位置pos
当src[i] != des[j]
时,看abcabdaababcbab中的d,在模式串中不存在d,因此pos += len(des)
,变到d后面的a的位置,j=0
。函数
此时:spa
abcabdaababcbabcode
\(\ \ \ \ \ \ \ \ \ \ \\)babcb字符串
再看c是否存在于des
,存在。从右向左找到des
中第一个与c匹配的位置,并将des
与之对其:class
abcabdaababcbabwhile
\(\quad\quad\quad\\)babcbco
本例完成匹配。字符
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