給出兩個字串:
helloworld,loop
最長子串行為:loo
最長子串為:lo
最長子序列:
特點通常為不連續,
從定義可得,這個矩陣的第一行和第一列都為0,而從第二行第二列往後的位置的值只跟之前左上方已經填寫的值相關,因此開始用公式填寫剩下的值。
通過回溯查詢的方式來拿出公共序列,其大致**如下:
最長公共子串:
在定義上,動態規劃的子問題 res [ i ] [ j ] 變為以 a [ i ] 和 b [ j ] 為最後乙個元素並且相等的最長子串長度,
# 多生成一行一列,初始依然全為0
res =[[
0for i in
range
(len1 +1)
]for j in
range
(len2 +1)
]# 記錄最大長度
max_len =
0# 記錄最大長度子串最後一位的行索引
idx_r =
0# 記錄最大長度子串最後一位的列索引
idx_c =
0# 依然從第二行第二列的位置開始填寫
for i in
range(1
, len2 +1)
:for j in
range(1
, len1 +1)
:if string2[i -1]
== string1[j -1]
: res[i]
[j]= res[i -1]
[j -1]
+1if res[i]
[j]>= max_len:
max_len = res[i]
[j] idx_r = i
idx_c = j
s =''while string2[idx_r -1]
== string1[idx_c -1]
: s += string2[idx_r -1]
idx_r -=
1 idx_c -=
1return s[::
-1], max_len
最長公共子串和最長公共子串行
二者含義沒搞清楚,雅虎的筆試就這樣的寫錯了。求最長公共字串的題目寫成了最長公共子串行。子串要求字元必須是連續的,但是子串行就不是這樣了。悲催了。子串行跟子串的求法類似,都是使用動態規劃的思想,s1每次增加乙個字元,看與s2當前位置的字元是不是相同,如果相同做相應的處理,如果不同,做另外的處理。子串行...
最長公共子串行和最長公共子串
問題定義 最長公共子串行,序列的意思是順序對就可以,並不需要是連續的。例如 abcde oalblcldle其中abcde就是這兩個字串的最長公共子串行。容易知道乙個長度為n的字串的子串行有2 n 個,假設兩個字串的長度都為n,直接去求解兩個字串的最長公共子串行需要用這2 n 個序列串去匹配另外乙個...
最長公共子串行 最長公共子串
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...