最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3 kmp 字符串匹配的方法

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

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

拋出問題

給定一個文本串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個字符開始,看匹配是否成功
        break  #匹配失敗,直接跳出循環(huán),i+1,繼續(xù)從第一個字符匹配
      j += 1   #匹配成功就繼續(xù)匹配下一個字符,知道pat_str每個字符都匹配完
    if j == len(pat_str):
      return i
  return -1

print(str_match(text_str,pat_str))

之所以稱之為暴力解法,就是因為每次匹配失敗之后就將模式串,向后移動一位,從頭開始匹配,一直循環(huán)下去。造成時間復(fù)雜度高,kmp也就是優(yōu)化這個地方,每一次匹配失敗,下次移動的距離next值

KMP

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

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

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

最大前綴和最大后綴

    

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

代碼實現(xiàn)  

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

#得到字符對應(yīng)的next值
def str_next(s):
  #前兩個字符默認等于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字符串,匹配進行到的位置,下次開始匹配的位置
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   #標志位,用來判斷是否匹配成功
    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)

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

相關(guān)文章

  • python寫入文件如何取消自動換行

    python寫入文件如何取消自動換行

    這篇文章主要介紹了python寫入文件如何取消自動換行問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python?正則表達式基礎(chǔ)知識點及實例

    Python?正則表達式基礎(chǔ)知識點及實例

    在本篇文章里小編給大家整理了關(guān)于Python正則表達式的一些基礎(chǔ)知識點以及相關(guān)用法實例內(nèi)容,需要的朋友們可以參考下。
    2021-12-12
  • Python安裝圖文教程 Pycharm安裝教程

    Python安裝圖文教程 Pycharm安裝教程

    這篇文章主要為大家詳細介紹了Pycharm及Python安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • pytorch中圖像的數(shù)據(jù)格式實例

    pytorch中圖像的數(shù)據(jù)格式實例

    今天小編就為大家分享一篇pytorch中圖像的數(shù)據(jù)格式實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • pyecharts調(diào)整圖例與各板塊的位置間距實例

    pyecharts調(diào)整圖例與各板塊的位置間距實例

    這篇文章主要介紹了pyecharts調(diào)整圖例與各板塊的位置間距實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python中的defaultdict與__missing__()使用介紹

    Python中的defaultdict與__missing__()使用介紹

    下面這篇文章主要給大家介紹了關(guān)于Python中defaultdict使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Python3中使用PyMongo的方法詳解

    Python3中使用PyMongo的方法詳解

    平常在處理數(shù)據(jù)的時候,必不可少地要使用數(shù)據(jù)庫存取數(shù)據(jù),出于一些原因,個人非常喜歡MongoDB這個數(shù)據(jù)庫。下面這篇文章主要給大家介紹了Python3中使用PyMongo的方法示例,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • 對django 2.x版本中models.ForeignKey()外鍵說明介紹

    對django 2.x版本中models.ForeignKey()外鍵說明介紹

    這篇文章主要介紹了對django 2.x版本中models.ForeignKey()外鍵說明介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python3 元組tuple入門基礎(chǔ)

    Python3 元組tuple入門基礎(chǔ)

    這篇文章主要介紹了Python3 元組tuple入門基礎(chǔ),需要的朋友可以參考下
    2020-02-02
  • Python?Pygame實戰(zhàn)之紅心大戰(zhàn)游戲的實現(xiàn)

    Python?Pygame實戰(zhàn)之紅心大戰(zhàn)游戲的實現(xiàn)

    說起Windows自帶的游戲,相信許多80、90后的朋友都不陌生。本文就將利用Python中的Pygame模塊實現(xiàn)一下windows經(jīng)典游戲之一的紅心大戰(zhàn),需要的可以參考一下
    2022-02-02

最新評論

浦江县| 泾源县| 高雄市| 荥阳市| 鞍山市| 开鲁县| 赤水市| 长乐市| 黄浦区| 江川县| 阳东县| 合肥市| 安龙县| 乡宁县| 比如县| 通河县| 枞阳县| 周口市| 桐梓县| 镇坪县| 商丘市| 慈利县| 延川县| 石景山区| 昆明市| 梓潼县| 宕昌县| 保定市| 乌审旗| 民丰县| 三都| 杭州市| 兴城市| 中阳县| 旬邑县| 伊宁县| 庄浪县| 福安市| 观塘区| 小金县| 桐乡市|