タイトル説明
リンク:https://www.nowcoder.com/questionTerminal/02e7cc263f8a49e8b1e1dc9c116f7602
制限時間:3秒;スペース制限:32768K
2つの文字列の場合、時間計算量がO(m * n)(mとnは2つの文字列の長さ)のアルゴリズムを設計して、2つの文字列の最長の共通部分文字列の長さを見つけてください。ここで最も長い共通の部分文字列は、2つのシーケンスU1、U2、... UnおよびV1、V2、... Vnとして定義されます。ここで、Ui + 1 == Ui + 1、Vi + 1 == Vi + 1、およびUi = = Vi。
2つの文字列AとBが与えられると、2つの文字列nとmの長さが同時に与えられます。
テストサンプル:
"1AB2345CD"、9、 "12345EF"、7 は次を返します:4
問題解決のアイデア
最長共通部分列と最長共通部分列の違いは、部分文字列が連続している必要があることです。マトリックスのZサイズN * Mが構築することができる。対応する位置Z [I] [J]に行列はかどうかを表すA [I]及びB [j]が同じである。のみ連続対角線上の番号は同じ、位置を表しますこれは2つの文字列ABの共通の文字列です。したがって、Z [i]は[J]、のためにA [i]とB [j]は場合と等しくない値0 ;場合等しい次に取るZは[I-1] [J -1]の値に1を加え表すため現在のパブリック文字列の長さ。最後に、行列z全体の最大値が出力されます。これは、最長の共通部分文字列の長さです。
テスト例に対応する行列zは次のとおりです。
[[
1、0、0、0、0、0、0、0、0]、
[0、0、0、1、0、0、0、0、0 ]、[0、0、0、0、 2、0、0、0、0]、
[0、0、0、0、0、3、0、0、0]、
[0、0、0、0、0、0、4、0、0] 、
[0、0、0、0、0、0、0、0、0]、
[0、0、0、0、0、0、0、0、0]]
サンプルプログラム:
# -*- coding:utf-8 -*-
class LongestSubstring:
def findLongest(self, A, n, B, m):
# write code here
z = [[0 for i in range(m)] for j in range(n)]
max_val = 0 #记录最大值
for i in range(n):
for j in range(m):
if A[i]==B[j]:
if i==0 or j==0:
z[i][j] = 1
else:
z[i][j] = z[i-1][j-1]+1
if z[i][j]>max_val:
max_val = z[i][j]
return max_val