题解 | #公共子串计算# Python3 DP

公共子串计算

http://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

DP解法,时间复杂度O(MN):

def dp(s1, s2):
    m, n = len(s1) + 1, len(s2) + 1
    li = [[0] * m for _ in range(n)]
    max_len = 0
    for row in range(1, n):
        for col in range(1, m):
            if s1[col - 1] == s2[row - 1]:
                if li[row - 1][col - 1]:
                    li[row][col] = li[row - 1][col - 1] + 1
                else:
                    li[row][col] = 1
                max_len = max(max_len, li[row][col])
    return max_len


if __name__ == '__main__':
    while True:
        try:
            a = input()
            b = input()
            print(dp(a, b))
        except:
            break

关键在于构造DP表:

图片说明
当DP表的行和列对应的字符相等时,需要对应位置记录为1,如果li[i-1][j-1]为非0,说明是连续字符串,需要加上li[i-1][j-1]的值。

全部评论

相关推荐

脾气小祖宗:这简历摸到都得狠狠地消毒液洗手😂
点赞 评论 收藏
分享
09-30 14:33
Python
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务