例:bdcaba和abcbdab,最長公共子串行為 bcba。
dp解法:字串1的長度為length1,字串2的長度為length2,建立乙個二維陣列c[length1][length2]用來記錄最長公共子串行的長度,狀態轉移方程為
整個狀態轉移以及二維陣列矩陣c為
# 生成字串長度加1的0矩陣,m用來儲存對應位置匹配的結果
length1 = len(s1)
length2 = len(s2)
result = ''
c = [[0 for x in range(length2 + 1)] for y in range(length1 + 1)]
for i in range(length1):
for j in range(length2):
if s1[i] == s2[j]:
c[i+1][j+1] = c[i][j] + 1
else:
c[i+1][j+1] = max(c[i][j+1], c[i+1][j])
print("max length: ", c[length1][length2])
find_lcseque('abcbdab', 'bdcaba')
子串是一種特殊的子串行,同樣可以由dp做。
二維陣列的定義如上,狀態轉移方程為
最大長度為result,初始值為0,當
# 生成字串長度加1的0矩陣,m用來儲存對應位置匹配的結果
length1 = len(s1)
length2 = len(s2)
substr_length = 0
c = [[0 for x in range(length2 + 1)] for y in range(length1 + 1)]
for i in range(length1):
for j in range(length2):
if s1[i]==s2[j]:
c[i][j] = c[i-1][j-1] + 1
substr_length = max(c[i][j], substr_length)
else:
c[i][j] = 0
print("substr max length: ", substr_length)
find_lcssubstr('abcbdab', 'bdcaba')
最長公共字串和最長公共子串行
給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...
最長公共子串和最長公共子串行
二者含義沒搞清楚,雅虎的筆試就這樣的寫錯了。求最長公共字串的題目寫成了最長公共子串行。子串要求字元必須是連續的,但是子串行就不是這樣了。悲催了。子串行跟子串的求法類似,都是使用動態規劃的思想,s1每次增加乙個字元,看與s2當前位置的字元是不是相同,如果相同做相應的處理,如果不同,做另外的處理。子串行...
最長公共子串行和最長公共子串
問題定義 最長公共子串行,序列的意思是順序對就可以,並不需要是連續的。例如 abcde oalblcldle其中abcde就是這兩個字串的最長公共子串行。容易知道乙個長度為n的字串的子串行有2 n 個,假設兩個字串的長度都為n,直接去求解兩個字串的最長公共子串行需要用這2 n 個序列串去匹配另外乙個...