Verwenden Sie Python, um den längsten gemeinsamen Teilstring der dynamischen Programmierung zu realisieren

Diese Frage ist eine sehr klassische Frage in der dynamischen Programmierung. Finden Sie den längsten gemeinsamen Teilstring in zwei Strings und geben Sie seine maximale Länge oder maximalen String zurück.

1. Ideen zur Problemlösung

Wir können die beiden Zeichenfolgen als Zeilen und Spalten einer zweidimensionalen Matrix verwenden und dann vergleichen, ob die Zeichen in den Zeilen- und Spaltenzeichenfolgen, die jedem Punkt in der zweidimensionalen Matrix entsprechen, gleich sind. Wenn sie das sind Gleiches gilt, sie werden auf 1 gesetzt, andernfalls werden sie auf 0 gesetzt. Dann müssen Sie nur noch die längste Diagonale mit dem Wert 1 finden, um das Problem zu lösen.
Zum Beispiel für die folgenden zwei Zeichenfolgen:

str1="asdfas"
str2="werasdfaswer"

Fügen Sie hier eine Bildbeschreibung ein
Es kann festgestellt werden, dass die von uns gesuchte gemeinsame Teilzeichenfolge aus mehreren diagonalen Linien in der Abbildung besteht und die lange gemeinsame Teilzeichenfolge diejenige mit der längsten Diagonale ist.

2. Dynamische Programmierung

Der Kern der dynamischen Programmierung besteht darin, wie die Ergebnisse des vorherigen Schritts übertragen, verwendet und anhand der aktuellen Bedingungen beurteilt werden, um das Ergebnis des aktuellen Status zu erhalten:
Fügen Sie hier eine Bildbeschreibung ein

record[i][j]=1可以演变为record[i][j]=1+record[i-1][j-1]

3. Die Funktion realisiert die Ausgabe der Länge des längsten gemeinsamen Teilstrings

def lcs_max_num(str1, str2):
    m = len(str1)
    n = len(str2)
    max_num = 0
    # 构造一个(m+1)*(n+1)的二维数组来存储LCS的长度
    lcs_len = [[0] * (n + 1) for i in range(m + 1)]

    # 动态规划求解LCS的长度
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                lcs_len[i][j] = lcs_len[i - 1][j - 1] + 1
            if max_num < lcs_len[i][j]:
                max_num = lcs_len[i][j]
    return max_num

if __name__ == "__main__":
    str1 = 'asdfas'
    str2 = 'werasdfaswer'
    print(lcs_max_num(str1, str2))

Viertens realisiert die Funktion die Ausgabe der längsten gemeinsamen Teilzeichenfolge

def lcs_max_char(str1, str2):
    m = len(str1)
    n = len(str2)
    # 构造一个(m+1)*(n+1)的二维数组来存储LCS的长度
    lcs_len = [[0] * (n + 1) for i in range(m + 1)]

    # 动态规划求解LCS的长度
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                lcs_len[i][j] = lcs_len[i - 1][j - 1] + 1
            else:
                lcs_len[i][j] = max(lcs_len[i - 1][j], lcs_len[i][j - 1])

    # 根据LCS的长度求解LCS的文本
    lcs_text = ""
    i = m
    j = n
    while i > 0 and j > 0:
        if str1[i - 1] == str2[j - 1]:
            lcs_text = str1[i - 1] + lcs_text
            i -= 1
            j -= 1
        elif lcs_len[i - 1][j] > lcs_len[i][j - 1]:
            i -= 1
        else:
            j -= 1

    return lcs_text

if __name__ == "__main__":
    str1 = 'asdfas'
    str2 = 'werasdfaswer'
    print(lcs_max_char(str1, str2))

Supongo que te gusta

Origin blog.csdn.net/TFATS/article/details/129734193
Recomendado
Clasificación