聽到字符串匹配,咱們第一想到的是經典的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