動態規劃問題 —— 最長公共子串

題目描述

鏈接:https://www.nowcoder.com/questionTerminal/02e7cc263f8a49e8b1e1dc9c116f7602

時間限制:3秒;空間限制:32768K

對於兩個字符串,請設計一個時間複雜度爲O(m*n)的算法(這裏的m和n爲兩串的長度),求出兩串的最長公共子串的長度。這裏的最長公共子串的定義爲兩個序列U1,U2,..Un和V1,V2,...Vn,其中Ui + 1 == Ui+1,Vi + 1 == Vi+1,同時Ui == Vi。

給定兩個字符串AB,同時給定兩串的長度nm

測試樣例:

"1AB2345CD",9,"12345EF",7
返回:4

解題思路

本題求的時最長公共子串,和求最長公共子序列的區別在於子串必須連續。可以構建大小爲n*m矩陣z,矩陣上對應位置z[i][j]代表A[i]B[j]是否相同,只有在一條連續斜線上的數均相同,代表該位置爲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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章