Python最長(zhǎng)公共子串算法實(shí)例
本文實(shí)例講述了Python最長(zhǎng)公共子串算法。分享給大家供大家參考。具體如下:
#!/usr/bin/env python
# find an LCS (Longest Common Subsequence).
# *public domain*
def find_lcs_len(s1, s2):
m = [ [ 0 for x in s2 ] for y in s1 ]
for p1 in range(len(s1)):
for p2 in range(len(s2)):
if s1[p1] == s2[p2]:
if p1 == 0 or p2 == 0:
m[p1][p2] = 1
else:
m[p1][p2] = m[p1-1][p2-1]+1
elif m[p1-1][p2] < m[p1][p2-1]:
m[p1][p2] = m[p1][p2-1]
else: # m[p1][p2-1] < m[p1-1][p2]
m[p1][p2] = m[p1-1][p2]
return m[-1][-1]
def find_lcs(s1, s2):
# length table: every element is set to zero.
m = [ [ 0 for x in s2 ] for y in s1 ]
# direction table: 1st bit for p1, 2nd bit for p2.
d = [ [ None for x in s2 ] for y in s1 ]
# we don't have to care about the boundery check.
# a negative index always gives an intact zero.
for p1 in range(len(s1)):
for p2 in range(len(s2)):
if s1[p1] == s2[p2]:
if p1 == 0 or p2 == 0:
m[p1][p2] = 1
else:
m[p1][p2] = m[p1-1][p2-1]+1
d[p1][p2] = 3 # 11: decr. p1 and p2
elif m[p1-1][p2] < m[p1][p2-1]:
m[p1][p2] = m[p1][p2-1]
d[p1][p2] = 2 # 10: decr. p2 only
else: # m[p1][p2-1] < m[p1-1][p2]
m[p1][p2] = m[p1-1][p2]
d[p1][p2] = 1 # 01: decr. p1 only
(p1, p2) = (len(s1)-1, len(s2)-1)
# now we traverse the table in reverse order.
s = []
while 1:
print p1,p2
c = d[p1][p2]
if c == 3: s.append(s1[p1])
if not ((p1 or p2) and m[p1][p2]): break
if c & 2: p2 -= 1
if c & 1: p1 -= 1
s.reverse()
return ''.join(s)
if __name__ == '__main__':
print find_lcs('abcoisjf','axbaoeijf')
print find_lcs_len('abcoisjf','axbaoeijf')
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
- python實(shí)現(xiàn)求兩個(gè)字符串的最長(zhǎng)公共子串方法
- 詳解Python最長(zhǎng)公共子串和最長(zhǎng)公共子序列的實(shí)現(xiàn)
- python實(shí)現(xiàn)對(duì)求解最長(zhǎng)回文子串的動(dòng)態(tài)規(guī)劃算法
- Python實(shí)現(xiàn)針對(duì)給定字符串尋找最長(zhǎng)非重復(fù)子串的方法
- Python簡(jiǎn)單實(shí)現(xiàn)查找一個(gè)字符串中最長(zhǎng)不重復(fù)子串的方法
- python實(shí)現(xiàn)求最長(zhǎng)回文子串長(zhǎng)度
- Python實(shí)現(xiàn)簡(jiǎn)單查找最長(zhǎng)子串功能示例
相關(guān)文章
anaconda?部署Jupyter?Notebook服務(wù)器過(guò)程詳解
這篇文章主要為大家介紹了anaconda?部署Jupyter?Notebook服務(wù)器過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Python實(shí)現(xiàn)讀取及寫入csv文件的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)讀取及寫入csv文件的方法,涉及Python針對(duì)csv格式文件的讀取、遍歷、寫入等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Python實(shí)現(xiàn)的井字棋(Tic Tac Toe)游戲示例
這篇文章主要介紹了Python實(shí)現(xiàn)的井字棋(Tic Tac Toe)游戲,結(jié)合實(shí)例形式分析了井字棋的原理及Python相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01
tensorflow學(xué)習(xí)筆記之mnist的卷積神經(jīng)網(wǎng)絡(luò)實(shí)例
這篇文章主要為大家詳細(xì)介紹了tensorflow學(xué)習(xí)筆記之mnist的卷積神經(jīng)網(wǎng)絡(luò)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Python中的單下劃線和雙下劃線使用場(chǎng)景詳解
這篇文章主要介紹了Python中的單下劃線和雙下劃線使用場(chǎng)景詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
對(duì)python中執(zhí)行DOS命令的3種方法總結(jié)
今天小編就為大家分享一篇對(duì)python中執(zhí)行DOS命令的3種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助一起。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

