python實現最長公共子串

2021-09-28 17:09:54 字數 1307 閱讀 9716

import numpy as np

deflongest_substring

(str1,str2)

:# 首先建立乙個長寬分別為len(str1),len(str2)的二維陣列

record = np.zeros(shape=

(len

(str1)

,len

(str2)))

# 獲取第乙個字串的長度

str1_length =

len(str1)

# 獲取第二個字串的長度

str2_length =

len(str2)

# 最大長度

maxlen =

0# 結束的索引

maxend =

0for i in

range

(str1_length)

:for j in

range

(str2_length)

:# 判斷兩個字串對應的索引是否相同

if str1[i]

== str2[j]

:# 判斷是否是第一行或者是第一列

if i==

0or j==0:

# 如果是則對應索引置一

record[i]

[j]=

1else

:# 如果不是對應的索引則為其左上角對應的元素加一

record[i]

[j]= record[i-1]

[j-1]+

1else

:# 如果字串對應的元素不相同則置零

record[i]

[j]=

0# 判斷記錄數值是否大於最大長度

if record[i]

[j]> maxlen:

# 如果是則充值最大長度

maxlen = record[i]

[j]# 將結束索引置為i

maxend = i

print

(record)

# 返回結果為,起始的索引及最大的長度

return maxend-maxlen+

1,maxlen

str1 =

'acbcbcef'

str2 =

'abcbced'

x_start,maxlen = longest_substring(str1,str2)

print

(x_start,maxlen)

原理及c實現可以參照下面鏈結

詳解Python最長公共子串和最長公共子串行的實現

最長公共子串 the longest common substring lcs問題就是求兩個字串最長公共子串的問題。解法就是用乙個矩陣來記錄兩個字串中所有位置的兩個字元之間的匹配情況,若是匹配則為1,否則為0。然後求出對角線最長的1的序列,其對應的位置就是最長匹配子串的位置。def find lcs...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...