这是两个字符串,所以状态转移矩阵肯定是二维矩阵。另外dp[ i ][ j ]代表的意思不是分别一个字符串的前 i 个和另一个字符串的前 j 个字符里面的最长连续子串。而是以A[ i ]和B[ j ]为末端的公共连续子串长度。如果dp[ i ][ j ]代表是目前最长连续子串,那么递推公式就写不出来,因为不知道dp[ i ][ j ]中公共子串的位置,所以就不知道添加字符之后对公共字符串长度的影响。
所以dp[ i ][ j ]代表尾部的公共子串长度,然后取所有dp[ i ][ j ]中的最大值,就是两个字符串中最长公共连续子串的长度。
def LCstring(string1,string2):
len1 = len(string1)
len2 = len(string2)
res = [[0 for i in range(len1+1)] for j in range(len2+1)]
result = 0
# 循环要从0到len(string)+1
# 原因就是从第0个字符串开始时候,保持递推公式的完整,不用在第0个字符串时,前面没有可依据的数值。所以就是初始化了dp[0][j]和dp[i][0]为0
for i in range(1,len2+1):
for j in range(1,len1+1): # 这个双层循环的意义就是填满二维矩阵,对于算法原理本身没有什么关联
if string2[i-1] == string1[j-1]:
# 递推公式
res[i][j] = res[i-1][j-1]+1
# result是全局的结果
result = max(result,res[i][j])
return result
print(LCstring("helloworld","loop"))