Der längste gemeinsame Teilstring (Länge finden und Teilstring finden)

Problem

Das längste häufig auftretende Teilzeichenfolgenproblem besteht darin, die längste Teilzeichenfolge von zwei oder mehr bekannten Zeichenfolgen zu finden. Der Unterschied zwischen diesem Problem und dem längsten gemeinsamen Teilsequenzproblem besteht darin, dass die Teilfolge nicht stetig sein muss, sondern die Teilzeichenfolge.
Angenommen, es gibt zwei Zeichenfolgen, finden Sie die längste gemeinsame fortlaufende Teilzeichenfolge unter ihnen, geben Sie ihre Länge aus und suchen Sie die längste gemeinsame Teilzeichenfolge.

Eingabe:
abcde
bcd
Ausgabe:
3
bcd

Ideen

Dynamische Planung
Füllen Sie das Formular aus

Fügen Sie hier eine Bildbeschreibung ein

Code

def maxLengthStr(a,b):
    n = len(a)
    m = len(b)
    res = [[0 for _ in range(m)] for _ in range(n)]
    for j in range(m):
        if a[0] == b[j]:
            res[0][j] = 1
    for i in range(n):
        if b[0] == a[i]:
            res[i][0] = 1
    max_len = 0
    index = 0
    for i in range(1,n):
        for j in range(1,m):
            if a[i-1] == b[j-1] and a[i] == b[j]:
                res[i][j] = res[i-1][j-1]+1
            if res[i][j] > max_len:
                max_len = res[i][j]
                index = j
    print(res)
    return max_len,index


if __name__ == '__main__':
    a = [1,2,3]
    b = [1,2,3,3,2,1]
    max_len,end = maxLengthStr(a,b)
    start = end-max_len+1
    print('最长公共子串的长度为:',max_len)
    print('最长公共子串的起始索引',start)
    print('最长公共子串的末位索引', end)
    print('最长公共子串为',b[start:end+1])

Schriftliche Prüfungsfragen "perfekte Anordnung" Problem

Anwendungsfall für die Eingabe:
3
1 2 3
3 2 1
6
1 2 3 3 2 1
3 2 1 1 2 3

Code

def maxLengthStr(a,b):
    n = len(a)
    m = len(b)
    res = [[0 for _ in range(m)] for _ in range(n)]
    for j in range(m):
        if a[0] == b[j]:
            res[0][j] = 1
    for i in range(n):
        if b[0] == a[i]:
            res[i][0] = 1
    max_len = 0
    index = 0
    for i in range(1,n):
        for j in range(1,m):
            if a[i-1] == b[j-1] and a[i] == b[j]:
                res[i][j] = res[i-1][j-1]+1
            if res[i][j] > max_len:
                max_len = res[i][j]
                index = j
    print(res)
    return max_len,index


def ver(a_value, b_value, start, end):
    print(a_value[:])
    print(b_value[start:end+1])
    if a_value[:] == b_value[start:end+1]:
        return True
    return False


if __name__ == '__main__':
    a = [1,2,3]
    a_value = [3,2,1]
    b = [1,2,3,3,2,1]
    # b_value = [5,4,3,2,1,1]
    b_value = [3,2,1,1,2,3]
    max_len,end = maxLengthStr(a,b)
    start = end-max_len+1
    print('最长公共子串的长度为:',max_len)
    print('最长公共子串的起始索引',start)
    print('最长公共子串的末位索引', end)
    print('最长公共子串为',b[start:end+1])
    if ver(a_value, b_value, start, end):
        print("完美排列存在,索引为:",start)
    else:
        print('完美排列不存在!')


Ich denke du magst

Origin blog.csdn.net/weixin_44776894/article/details/108509341
Empfohlen
Rangfolge