部分转载自
http://lib.csdn.net/article/python/39140#focustext 和
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
s -- 目标串 p -- 模式串
# 朴素字符串匹配算法,时间复杂度为O(m*n) def naive_match(s, p): m, n = len(p), len(s) for i in range(n-m+1): # 一共比较n-m+1次 if s[i:i+m] == p: return i return -1 print naive_match('abc', 'bc') print naive_match('ABCDABCDABDE', 'ABCDABD') # 匹配表 def partial_table(p): m = len(p) tab = [0] * m prefix = set() for i in range(1, m): prefix.add(p[:i]) suffix = {p[j:i+1]for j in range(1, i+1)} tab[i] = max(map(lambda x: len(x), (prefix & suffix or {''}))) return tab # KMP算法, 时间复杂度为O(m+n) def kmp_match(s, p): table = partial_table(p) m, n = len(p), len(s) for i in range(n-m+1): # 最多的可能比较n-m+1 for j in range(m): if s[i+j] != p[j]: i += max(j - table[j-1], 1) break else: return i return -1 print kmp_match('abc', 'bc') print kmp_match('ABCDABCDABDE', 'ABCDABD')
KMP算法运用场景:用于模式串匹配较多的情况下。
KMP算法的缺点:当目标串很大且匹配很罕见的时候(比如在文章中找单词或在邮件里找垃圾过滤关键字)
对于目标串很大且匹配很罕见的情况,使用Boyer-Moore算法效率比较高。
Boyer-Moore算法请见:
http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
对于子字符串的查找,Python提供了find()和index()两个函数,这两个函数实现的算法是Horspool算法,Horspool算法可以看做是简化版的Boyer-Moore算法。
请见:http://blog.csdn.net/jjdiaries/article/details/12771439