An example of the KMP algorithm worth looking at

The KMP (Knuth-Morris-Pratt) algorithm is a string matching algorithm for finding a pattern string P in a text string S. It was designed by Donald Knuth, Vaughn Pratt and James H. Morris in 1977. The main advantage of the KMP algorithm is that it uses the information of matching failures to reduce the matching times between pattern strings and text strings, thereby improving the efficiency of string matching. Time complexity is O(n+m)

Here is an example of a simple KMP algorithm that finds the first match of a pattern P in a text string S:

  def KMPSearch(pat, txt):

      M = len(pat)

      N = len(txt)

      # create lps[] that will hold the longest prefix suffix

      # values for pattern

      lps = [0]*M

      j = 0 # index for pat[]

      # Preprocess the pattern (calculate lps[] array)

      computeLPSArray(pat, M, lps)

      i = 0 # index for txt[]

      while i < N:

          if pat[j] == txt[i]:

              i += 1

              j += 1

          if j == M:

              print("Found pattern at index " + str(i-j))

              j = lps[j-1]

          # mismatch after j matches

          elif i < N and pat[j] != txt[i]:

              # Do not match lps[0..lps[j-1]] characters,

              # they will match anyway

              if j != 0:

                  j = lps[j-1]

              else:

                  i += 1

  def computeLPSArray(pat, M, lps):

      len = 0 # length of the previous longest prefix suffix

      lps[0] = 0 # lps[0] is always 0

      i = 1

      # the loop calculates lps[i] for i = 1 to M-1

      while i < M:

          if pat[i] == pat[len]:

              len += 1

              lps[i] = len

              i += 1

          else:

              # This is tricky. Consider the example.

              # AAACAAAA and i = 7. The idea is similar

              # to search step.

              if len != 0:

                  len = lps[len-1]

              else:

                  lps[i] = 0

                  i += 1

  txt = "ABABDABACDABABCABAB"

  pat = "ABABCABAB"

  KMPSearch(pat, txt)
 

 

转载说明:本文部分内容引用自电脑监控软件https://www.vipshare.com/archives/10957,转载请提供出处

 

Guess you like

Origin blog.csdn.net/llllaaaaiiii0421/article/details/129708432