欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python3 kmp 字符串匹配的方法

 更新時(shí)間:2018年07月07日 15:25:22   作者:7749ha  
這篇文章主要介紹了python3 kmp 字符串匹配的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

先聲明,本人菜鳥一個(gè),寫博客是為了記錄學(xué)習(xí)的過程,以及自己的理解和心得,可能有的地方寫的不好,希望大神指出。。。

拋出問題

給定一個(gè)文本串test_str(被匹配的字符串)和模式串pat_str(需要從文本串中匹配的字符串),從文本串test_str中找出模式串pat_str第一次出現(xiàn)的位置,沒有的話返回 -1

暴力方式

在說kmp之前,我們先來講下“暴力方式“,也就是說我們最原始的方法?!?/p>

text_str = 'asdabcdace'
pat_str = 'abcdace'

def str_match(text_str,pat_str):
  for i in range(0,len(text_str)):
    j = 1
    while j < len(pat_str):
      if text_str[i:i+j] != pat_str[0:j]: #從text_str第i個(gè)字符開始,看匹配是否成功
        break  #匹配失敗,直接跳出循環(huán),i+1,繼續(xù)從第一個(gè)字符匹配
      j += 1   #匹配成功就繼續(xù)匹配下一個(gè)字符,知道pat_str每個(gè)字符都匹配完
    if j == len(pat_str):
      return i
  return -1

print(str_match(text_str,pat_str))

之所以稱之為暴力解法,就是因?yàn)槊看纹ヅ涫≈缶蛯⒛J酱?,向后移?dòng)一位,從頭開始匹配,一直循環(huán)下去。造成時(shí)間復(fù)雜度高,kmp也就是優(yōu)化這個(gè)地方,每一次匹配失敗,下次移動(dòng)的距離next值

KMP

如果讓我完全給你講懂kmp算法可能不太容易,我只能大致粗略的將下它的一步步實(shí)現(xiàn)。我認(rèn)為就一個(gè)重點(diǎn),

如何求出模式串每個(gè)字符對應(yīng)的next值

因?yàn)榭赡?,每一次匹配失敗的長度的字符不一樣,也就對應(yīng)每次移動(dòng)的距離不一樣,那我們?nèi)绾吻竺總€(gè)字符對應(yīng)的next值,這就引出了另一個(gè)概念

最大前綴和最大后綴

    

假定最大前綴=最大后綴,長度為k 那么第i位字符,對應(yīng)的next值就為k+1,一次循環(huán)就能求出每個(gè)字符的next值

代碼實(shí)現(xiàn)  

#求字符串的next值
text_str = 'asdabcdace'
pat_str = 'abcdace'

#得到字符對應(yīng)的next值
def str_next(s):
  #前兩個(gè)字符默認(rèn)等于1
  next = [1,1]
  for x in range(2,len(s)):
    next.append(str_max_prx(s,x,next[x-1]-1) + 1)
  return next
#參數(shù) s字符串,匹配進(jìn)行到的位置,下次開始匹配的位置
def str_max_prx(s,x,last_value):
  next = 0
  for i in range(last_value,x):
    if s[0:i] == s[x-i:x]:
      next = i
  return next
def str_match(s,m):
  next = str_next(s)
  i=0
  s_len = len(s)
  m_len = len(m)
  while i <= m_len:
    flag = True   #標(biāo)志位,用來判斷是否匹配成功
    index = 1
    while index <= s_len:
      if m[i:i + index] != s[0:index]:
        i = i + next[index]
        flag = False
        break
      else:
        index += 1
    if flag:
      break
  if i >= m_len:
    i = -1
  return i
res = str_match(pat_str,text_str)
print(res)

代碼就是這樣,很多東西可能還需要自己理解。我記個(gè)筆記,為之后方便查找,希望對你能有幫助。也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 單元測試(unittest)的使用小結(jié)

    Python 單元測試(unittest)的使用小結(jié)

    Python中有一個(gè)自帶的單元測試框架是unittest模塊,用它來做單元測試,本篇文章主要介紹了Python 單元測試(unittest)的使用小結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python 中Operator模塊的使用

    Python 中Operator模塊的使用

    這篇文章主要介紹了Python 中Operator模塊的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Django DRF認(rèn)證組件流程實(shí)現(xiàn)原理詳解

    Django DRF認(rèn)證組件流程實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Django DRF認(rèn)證組件流程實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Pandas DataFrame轉(zhuǎn)換為字典的方法

    Pandas DataFrame轉(zhuǎn)換為字典的方法

    實(shí)際開發(fā)中我們可能會(huì)遇到一類問題,如何將Pandas DataFrame轉(zhuǎn)換為字典,本文就來介紹一下,感興趣的可以了解一下
    2021-05-05
  • 基于TensorFlow常量、序列以及隨機(jī)值生成實(shí)例

    基于TensorFlow常量、序列以及隨機(jī)值生成實(shí)例

    今天小編就為大家分享一篇基于TensorFlow常量、序列以及隨機(jī)值生成實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文)

    Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文)

    這篇文章主要介紹了Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python redis 批量設(shè)置過期key過程解析

    python redis 批量設(shè)置過期key過程解析

    這篇文章主要介紹了python redis 批量設(shè)置過期key過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python路徑的寫法及目錄的獲取方式

    python路徑的寫法及目錄的獲取方式

    今天小編就為大家分享一篇python路徑的寫法及目錄的獲取方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 使用Pytorch Geometric進(jìn)行鏈接預(yù)測的實(shí)現(xiàn)代碼

    使用Pytorch Geometric進(jìn)行鏈接預(yù)測的實(shí)現(xiàn)代碼

    PyTorch Geometric (PyG)是構(gòu)建圖神經(jīng)網(wǎng)絡(luò)模型和實(shí)驗(yàn)各種圖卷積的主要工具,在本文中我們將通過鏈接預(yù)測來對其進(jìn)行介紹,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-10-10
  • Python程序中的觀察者模式結(jié)構(gòu)編寫示例

    Python程序中的觀察者模式結(jié)構(gòu)編寫示例

    觀察者模式是最常用的設(shè)計(jì)模式之一,旨在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合,減少對象之間的耦合,這里我們就來看一下Python程序中的觀察者模式結(jié)構(gòu)編寫示例
    2016-05-05

最新評論