動態規劃之最長公共子串行 LCS

2022-07-08 21:18:14 字數 2662 閱讀 3837

最長公共子串行(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 的子串行對應...