動的計画問題-最長の一般的な部分文字列

タイトル説明

リンク: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つの文字列AB与えられる、2つの文字列nmの長さが同時に与えられます。

テストサンプル:

"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

 

おすすめ

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