91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python中實現一個最長公共子串

發布時間:2021-05-02 14:32:20 來源:億速云 閱讀:995 作者:Leah 欄目:開發技術

怎么在Python中實現一個最長公共子串?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

python主要應用領域有哪些

1、云計算,典型應用OpenStack。2、WEB前端開發,眾多大型網站均為Python開發。3.人工智能應用,基于大數據分析和深度學習而發展出來的人工智能本質上已經無法離開python。4、系統運維工程項目,自動化運維的標配就是python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數據分析。

最長公共子串(The Longest Common Substring)

LCS問題就是求兩個字符串最長公共子串的問題。解法就是用一個矩陣來記錄兩個字符串中所有位置的兩個字符之間的匹配情況,若是匹配則為1,否則為0。然后求出對角線最長的1的序列,其對應的位置就是最長匹配子串的位置。

def find_lcsubstr(s1, s2): 
 m=[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)] #生成0矩陣,為方便后續計算,比字符串長度多了一列
 mmax=0  #最長匹配的長度
 p=0 #最長匹配對應在s1中的最后一位
 for i in range(len(s1)):
 for j in range(len(s2)):
  if s1[i]==s2[j]:
  m[i+1][j+1]=m[i][j]+1
  if m[i+1][j+1]>mmax:
   mmax=m[i+1][j+1]
   p=i+1
 return s1[p-mmax:p],mmax  #返回最長子串及其長度
 
print find_lcsubstr('abcdfg','abdfg')

運行得到輸出:('dfg',3)

最長公共子序列 (The Longest Common Subsequence)

子串要求字符必須是連續的,但是子序列就不是這樣。最長公共子序列是一個十分實用的問題,它可以描述兩段文字之間的“相似度”,即它們的雷同程度,從而能夠用來辨別抄襲。對一段文字進行修改之后,計算改動前后文字的最長公共子序列,將除此子序列外的部分提取出來,這種方法判斷修改的部分,往往十分準確。
        解法就是用動態回歸的思想,一個矩陣記錄兩個字符串中匹配情況,若是匹配則為左上方的值加1,否則為左方和上方的最大值。一個矩陣記錄轉移方向,然后根據轉移方向,回溯找到最長子序列。

import numpy
def find_lcseque(s1, s2): 
 # 生成字符串長度加1的0矩陣,m用來保存對應位置匹配的結果
 m = [ [ 0 for x in range(len(s2)+1) ] for y in range(len(s1)+1) ] 
 # d用來記錄轉移方向
 d = [ [ None for x in range(len(s2)+1) ] for y in range(len(s1)+1) ] 
 
 for p1 in range(len(s1)): 
 for p2 in range(len(s2)): 
  if s1[p1] == s2[p2]:      #字符匹配成功,則該位置的值為左上方的值加1
  m[p1+1][p2+1] = m[p1][p2]+1
  d[p1+1][p2+1] = 'ok'     
  elif m[p1+1][p2] > m[p1][p2+1]: #左值大于上值,則該位置的值為左值,并標記回溯時的方向
  m[p1+1][p2+1] = m[p1+1][p2] 
  d[p1+1][p2+1] = 'left'     
  else:              #上值大于左值,則該位置的值為上值,并標記方向up
  m[p1+1][p2+1] = m[p1][p2+1]  
  d[p1+1][p2+1] = 'up'     
 (p1, p2) = (len(s1), len(s2)) 
 print numpy.array(d)
 s = [] 
 while m[p1][p2]:  #不為None時
 c = d[p1][p2]
 if c == 'ok':  #匹配成功,插入該字符,并向左上角找下一個
  s.append(s1[p1-1])
  p1-=1
  p2-=1 
 if c =='left': #根據標記,向左找下一個
  p2 -= 1
 if c == 'up':  #根據標記,向上找下一個
  p1 -= 1
 s.reverse() 
 return ''.join(s) 
print find_lcseque('abdfg','abcdfg')

得到輸出結果:

怎么在Python中實現一個最長公共子串

關于怎么在Python中實現一個最長公共子串問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克陶县| 鹤庆县| 南丹县| 佛坪县| 宜良县| 台南市| 宁晋县| 慈利县| 清水河县| 文登市| 武夷山市| 卓资县| 万安县| 息烽县| 清水河县| 昭觉县| 新河县| 板桥市| 瑞昌市| 砀山县| 桐柏县| 个旧市| 类乌齐县| 镇坪县| 班戈县| 平罗县| 澄江县| 同德县| 凤山县| 灯塔市| 阳高县| 且末县| 江油市| 乌拉特中旗| 长春市| 吐鲁番市| 津市市| 福州市| 改则县| 安福县| 大悟县|