動的計画問題-最長共通部分列

タイトル説明

リンク:https//www.nowcoder.com/questionTerminal/c996bbb77dd447d681ec6907ccfb488a

制限時間:3秒;スペース制限:32768K

2つの文字列の場合、最長共通部分列の長さを見つけるための効率的なアルゴリズムを設計してください。ここでの最長共通部分列は、2つのシーケンスU1、U2、U3 ... UnとV1、V2、V3 ... Vn、ここで、Ui&ltUi + 1、Vi&ltVi +1です。そして、A [Ui] == B [Vi]。

2つの文字列ABが与えられ、2つの文字列の長さがnmの場合、最長共通部分の長さを返します。2つのストリングの長さが300以下であることを確認してください。

テストサンプル:

"1A2C3D4B56",10,"B1D23CA45B6A",12
返回:6

問題解決のアイデア

行列Z [m +。1] [n-+。1]を定義します。ここで、Z [i] [j]は、前のi文字列の文字列A、最長共通部分列のj文字列の前の文字列Bを表しますその中で、z [0] [j]行とz [i] [0]は行列の最初の行と最初の列を表し、それらの値は両方とも0です。次に、z [i] [i]を検討するとき、最初にAを判断します[i]B [j]が同じかどうか、同じ場合はz [i-1] [j-1] +1であり、最長共通文字列に1を加算するのと同じです。両方の文字列から1つの文字が削除された場合;それ以外の場合は、z [i] [j-1]z [i-1] [j]最大値を取得します。したがって、z [1] [1]から開始し、で計算します。左から右、上から下の順序行列z全体、行列zの右下隅の値は、文字列AとBの最長共通部分列です。

テスト例に対応する行列zは次のとおりです。

[[0、0、0、0、0、0、0、0、0、0、0]、
 [0、0、0、0、0、0、0、0、1、1、1]、
 [ 0、1、1、1、1、1、1、1、1、1、1
 ]、
 [0、1、1、1、1、1、2、2、2、2、2 ]、[0、 1、1、2、2、2、2、2、2、2、2]、
 [0、1、1、2、2、3、3、3、3、3、3]、
 [0、1、 1、2、3、3、3、3、3、3、3]、
 [0、1、2、2、3、3、3、3、3、3、3]、
 [0、1、2、 2、3、3、3、4、4、4、4]、
 [0、1、2、2、3、3、3、4、4、5、5]、
 [0、1、2、2、 3、3、3、4、5、5、5]、
 [0、1、2、2、3、3、3、4、5、5、6]、
 [0、1、2、2、3、 3、3、4、5、5、6]]

サンプルプログラム:

# -*- coding:utf-8 -*-
class LCS:
    def findLCS(self, A, n, B, m):
        # write code here
        z = [[0 for i in range(n+1)] for j in range(m+1)]
        for i in range(1,m+1):
            for j in range(1,n+1):
                if A[j-1]==B[i-1]:
                    z[i][j] = z[i-1][j-1] + 1
                else:
                    z[i][j] = max(z[i-1][j],z[i][j-1])
        return z[m][n]

 

おすすめ

転載: blog.csdn.net/qq_14997473/article/details/89319980