タイトル説明
リンク: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つの文字列AとBが与えられ、2つの文字列の長さがnとmの場合、最長共通部分列の長さを返します。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]