最長の共通部分文字列(長さを見つけて部分文字列を見つける)

問題

最も長い共通の部分文字列の問題は、2つ以上の既知の文字列の最も長い部分文字列を見つけることです。この問題と最も長い一般的なサブシーケンスの問題の違いは、サブシーケンスが連続している必要はないが、サブストリングは連続している必要があることです。
2つの文字列があると仮定して、その中で最も長い共通の連続部分文字列を見つけ、その長さを出力して、最も長い共通の部分文字列を見つけます。

入力:
abcde
bcd
出力:
3
bcd

アイデア

動的計画
フォームに記入

ここに画像の説明を挿入

コード

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])

筆記試験問題「完全配置」問題

入力ユースケース:
3
1 2 3
3 2 1
6
1 2 3 3 2 1
3 2 1 1 2 3

コード

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('完美排列不存在!')


おすすめ

転載: blog.csdn.net/weixin_44776894/article/details/108509341