最長公共子串行(lcs,longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。而最長公共子串(要求連續)和最長公共子串行是不同的。
設x(m)= 和 y(n)=的最長公共子串行z(k)=
首先,將原問題分解為子問題,得出乙個已知的結論:當m或n等於0時,k等於0,即公共子串行長度為0
當m和n都不等於0時,此時分為三種情況:
(1) x(m) == y(n) ,此時z(k) = x(m) = y(n),該元素屬於當前最長公共子串行的最後乙個元素。此時z(k-1)=
(2) x(m) != y(n) ,且z(k) != x(m),此時z=
(3) x(m) != y(n) ,且z(k) != y(n),此時z=
其中x(m-1)= , y(n-1)=,z(k-1)=
上面三個步驟,每個步驟都是根據當前序列的狀態,將問題轉化為已知解的子問題(最初的已知解的子問題是當m==0或n==0時),從而求出當前問題的解。
由此便得出了該問題的狀態轉移方程,數學描述如下:
現有兩個序列x=,y=,
設乙個c[i,j]: 儲存xi與yj的lcs的長度
最後,該演算法的python實現:
1#最長公共子串行問題
2__author__ = '
ice'34
5#arr_x,arr_y [0 ~ length-1]6#
subarr_len [0,1~x_length][0,1~y_length]7#
flag [0 ~ x_length-1][0 ~ y_length]89
10def
lcs_length(arr_x, arr_y):
11 x_length =len(arr_x)
12 y_length =len(arr_y)
13 subarr_len = [[0 for j in range(y_length + 1)] for i in range(x_length + 1)]
14 flag = [[0 for j in range(y_length)] for i in
range(x_length)]
15for i in range(1, x_length + 1):
16for j in range(1, y_length + 1):
17if arr_x[i - 1] == arr_y[j - 1]:
18 subarr_len[i][j] = subarr_len[i - 1][j - 1] + 1
19 flag[i - 1][j - 1] = 1
20elif subarr_len[i - 1][j] >= subarr_len[i][j - 1]:
21 subarr_len[i][j] = subarr_len[i - 1][j]
22 flag[i - 1][j - 1] = 2
23else
:24 subarr_len[i][j] = subarr_len[i][j - 1]
25 flag[i - 1][j - 1] = 3
26return
2728
29def
lcs(arr_x, x_i, y_j, flag, result):
30if x_i < 0 or y_j <0:
31return
32if flag[x_i][y_j] == 1:
33 lcs(arr_x, x_i - 1, y_j - 1, flag, result)
3435
elif flag[x_i][y_j] == 2:
36 lcs(arr_x, x_i - 1, y_j, flag, result)
37elif flag[x_i][y_j] == 3:
38 lcs(arr_x, x_i, y_j - 1, flag, result)
3940
41 array_x = ['
a', '
b', '
c', '
b', '
d', '
a', 'b'
]42 array_y = ['
b', '
d', '
c', '
a', '
b', 'a'
]43 longest_common_subsequence =
44 lcs_info =lcs_length(array_x, array_y)
45 lcs(array_x, len(array_x) - 1, len(array_y) - 1, lcs_info['
flag
'], longest_common_subsequence)
46print(longest_common_subsequence)
動態規劃之最長公共子串行(lcs)
最長公共子串行的定義是,乙個數列z分別是已知數列的子串行 子串行不一定是連續序列,是在該序列中刪去若干元素後得到的序列 且是所有符合此條件序列中最長的,則z成為最長公共子串行lcs longest common subsequences 有些地方則說公共子串就是要求連續的子串行,有些地方則不是,這裡...
動態規劃之 最長公共子串行 LCS
這個問題是動態規劃演算法中的乙個經典問題,先看問題描述 lcs 兩個字串 x和 y,找到他們最長的公共子串行,該序列不要求是連續的。公共子串行的意思就是序列的相對順序是不變的,但是序列不一定是連續的。例如 x bdcaba y abcbdab 他們的最長公共子串行是bcba和bdab,長度都為4,找...
動態規劃之最長公共子串行(LCS)
動態規劃之最長公共子串行問題 前言 乙個給定序列的子串行,就是將給定的序列中零個或多個元素去掉後得到的結果。其形式化定義如下 給定乙個序列x 另乙個序列z 滿足如下條件時稱為x的子串行,即存在乙個嚴格遞增的x下表序列 i1,i2 ik 對所有j 1,2,3,k滿足xi zj例如z 是x 的子串行對應...