标签:algorithm
这个问题已经被做烂了...
下面是C语言实现集合.
http://www-igm.univ-mlv.fr/~lecroq/string/
留个爪~
暴力美啊~
""" Programmer : EOF Date : 2015.02.28 Code file : nsm.py """ def naive_string_matcher(T, P) : if (T or P) is None : return n = len(T) m = len(P) for s in range(0, n-m+1) : match = True for i in range(0, m) : if P[i] is not T[s+i] : match = False break if match is True : print "Pattern occurs with shift", s #------------ for testing -------------------- string1 = "hello goodbye and hello" string2 = "hello" naive_string_matcher(string1, string2)
""" Programmer : EOF Code date : 2015.02.28 Code file : rkm.py e-mail : jasonleaster@gmail.com """ def rabin_karp_matcher(T, P, d, q) : n = len(T) m = len(P) h = d**(m-1) % q p = 0 t_0 = 0 t = [0 for i in range(0, n - m + 1)] # preprosecessing for i in range(0, m) : p = ( d*p + ord(P[i]) ) % q t[0] = (d*t[0] + ord(T[i])) % q # matching for s in range(0, n-m+1) : match = True if p is t[s] : for i in range(0, m) : if P[i] is not T[s+i] : match = False break if match is True : print "Pattern occurs with shift", s if s < n-m : t[s+1] = (d * ( t[s] - ord(T[s]) * h ) + ord(T[s+m]) ) % q #------------ for testing -------------------- string1 = "hello goodbye and hello" string2 = "hello" rabin_karp_matcher(string1, string2, 10, 13)
""" Programmer : EOF Code date : 2015.02.28 Code file : kmp.py e-mail : jasonleaster@gmail.com Code description : Here is a implementation of KMP which is a useful algorithm for string matching. """ def kmp_matcher(T, P) : n = len(T) m = len(P) pi = compute_prefix_function(P) q = -1 # number of characters matched for i in range(0, n) : # scan the text from left to right while q > 0 and P[q+1] != T[i] : q = pi[q] # next character doesn't match if P[q+1] == T[i] : q += 1 # next character matches if (q+1) == m : # Is all of P matched ? print "Pattern occurs with shift ", i-m q = pi[q] # look for the next match def compute_prefix_function(P) : m = len(P) pi = [-1 for i in range(0, m)] k = -1 # Attention ! for q in range(1, m) : while k > 0 and P[k+1] != P[q] : k = pi[k] if P[k+1] == P[q] : k += 1 pi[q] = k return pi #-------------for testing---------------------- #string_1 = "hello goodbye and hello" #string_2 = "hello" string_1 = "abcabaabcabac" string_2 = "abaa" kmp_matcher(string_1, string_2)
PHP神人吐槽KMP
waiting for updates ... ...
String Matching -- Brute Force + Rabin-Karp + KMP
标签:algorithm
原文地址:http://blog.csdn.net/cinmyheart/article/details/43984801