最长公共子串(求长度和寻找子串)

问题

最长公共子串问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。
假设有两个字符串,找出其中最长的公共连续子串,输出其长度,并求出该最长公共子串。

输入:
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