要求:求两个字符串的最长公共子串,如“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. 返回最大公共子串
代码如下:
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