一、最長公共子串(longest common substring)
遍歷的時候用乙個二維陣列儲存相應位置的資訊,如果兩個子串1與子串2相應位置相等:則看各自前乙個位置是否相等,相等則該位置值b[i][j]=b[i-1][j-1]+1,不相等則置為1。如果兩個子串1與子串2相應位置不相等,則b[i][j]=0。如下:
**如下:
def二、最長公共子串行(longest common subsequence)跟最長公共子串一樣遍歷,用乙個二維陣列儲存相應位置的資訊,最長公共子串行基於這樣乙個思想:longestsub(str1,str2):
s1=list(str1)
s2=list(str2)
b=[([0]*len(s2)) for i in
range(len(s1))]
maxlen=0
for i in
range(len(s1)):
for j in
range(len(s2)):
if s1[i]==s2[j]:
if i-1>=0 and j-1>=0:
b[i][j]=b[i-1][j-1]+1
if b[i][j]>maxlen:
maxlen=b[i][j]
else
: b[i][j]=1
else
: b[i][j] =0
(b)
return
maxlen
s1="
asdfas
"s2="
werasdfaswer
"print(longestsub(s1,s2))
1.如果子串1與子串2當前位置相等,則說明最大公共子串行等於去掉當前位置各自前面子串的最大公共子串行值+1,即b[i][j]=b[i-1][j-1]+1
2.如果子串1與子串2當前位置不相等,則目前為止的最大公共子串行為: 與 s2 的lcs, 與 s1 的lcs 中的最大的那個序列。注:s1為子串1遍歷到當前位置為止的字串,s2為子串2遍歷到當前為止的字串。
#注意邊界條件,沒有b[i-1][j-1],就置為1,因為字元相等了肯定得為1了。
else
: b[i][j]=1
if b[i][j]>maxlen:
maxlen=b[i][j]
else
:
if i>0 and j>0:
b[i][j]=max(b[i-1][j],b[i][j-1])
#也是注意邊界條件,乙個減去1個字元,為空了,另乙個字串的最大子串行就是最大子串行值了。
if i>0 and j==0:
b[i][j]=b[i-1][j]
#同上
if i==0 and j>0:
b[i][j]=b[i][j-1]
#起始位置,b[0][0]的位置不相等,自然為0了
if i==0 and j==0:
b[i][j]=0
return maxlen
最長公共子串行 與 最長公共子串
最長公共子串行 常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。最長公共子串 是指在母串中連續出現的子串。例如 cnblogs belong 最長公共子串行為blog,最長公共子串為lo假設z z2,zk 是母串 x 與 y的最長公共子串行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 當然我們現在一眼就可以看出來最長公...