(算法总结)求最大公共子串

要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”,但是要求子串必须是连续的。

思路:动态规划法求解

定义二维数组dp[i][j],其中i用于遍历字符串s1的下标,j用于遍历s2的下标,于是dp[i][j]就用于记录当s1和s2分别遍历到i和j下标时,以s1[i]和s2[j]为结尾的最大公共子串长度,而要求最终的最大公共子串,需要用一个max_length变量随时记录当前的最大公共子串长度,并用res变量获取当前的最大公共子串。

算法设计:

1. 首先考虑参数null或长度为0的情况,直接返回空串

2.进入双重循环(分别遍历s1和s2串的各个字符):

    如果s1[j] == s2[j] then

        考虑边界情况,i==0 或 j==0 的情况下,dp[i][j] = 1

        除了边界情况,其余位置都满足 dp[i][j] = dp[i-1][j-1] + 1

        每次更新最大长度以及最大长度对应的公共子串

  3. 返回最大公共子串

扫描二维码关注公众号,回复: 2152529 查看本文章

代码如下:

def max_substring(s1, s2):
    if s1 is None or s2 is None:
        return ''
    if s1 == '' or s2 == '':
        return ''
    m = len(s1)
    n = len(s2)
    dp = []
    for i in range(m):
        dp.append([0] * n)
    max_length = 0
    res = ''
    for i in range(len(s1)):
        for j in range(len(s2)):
            if s1[i] == s2[j]:
                if i*j == 0:
                    dp[i][j] = 1
                else:
                    dp[i][j] = dp[i-1][j-1] + 1
                if max_length < dp[i][j]:
                    max_length = dp[i][j]
                    res = s1[i - max_length + 1: i+1]
    return res

猜你喜欢

转载自blog.csdn.net/little_fire/article/details/81012547
今日推荐