標籤:
所有字串匹配演算法的核心問題是,當出現不匹配時,如何向後移動模式串
一、暴力匹配演算法
如果要匹配一個字串s 和一個模式串p,則從i=0開始依次匹配s[i:(i+len(p))],簡單粗暴,代碼如下:
def matcher(t, p): # param t: the string to check # param p: pattern n = len(t) m = len(p) for i in xrange(0, n-m+1): if p == t[i:i+m]: return True
二、KMP演算法
參見:http://blog.csdn.net/v_july_v/article/details/7041827
簡單來說,就是當匹配字串s和模式串p時,當s[i]和p[j]不匹配時,不回溯S,而是將p右移一定位元開始匹配。所右移位元由以下規則確定:若p[j]前面的字串最大長度的前尾碼相同的字串長度為L, 則右移(已匹配字串長度—L),文字描述比較抽象,參見上面部落格內容
def pmt(s): """ PartialMatchTable """ prefix = [s[:i+1] for i in range(len(s)-1)] postfix = [s[i+1]: for i in range(len(s)-1)] intersection = list(set(prefix) & set(postfix)) # 得到相同前尾碼 if intersection: return len(intersection[0]) # 得到最長前尾碼 return odef kmp(t, p): # t: the string to check # p: pattern i = 0 while i < len(t) - len(p) + 1: match = True for j in range(len(p)): if t[i+j] != p[j]: match = False break if match: return True # kmp if j: i += j - pmt(p[:j]) else: i += 1 return False
以上代碼參考http://cnblogs.com/goodspeed/p/3295456.html
另外,還有BM演算法,sunday演算法以及horspool演算法,後兩種是遷移中的變種,“BM演算法在實際應用中比KMP演算法快三到五倍”。
字串匹配的python實現