[路飞]_夜寻最长公共子序列

862 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战1143. 最长公共子序列

动态规划

假设两个字符串分别为

text1 = "abcde", text2 = "ace" ;

text1长度为m;text2长度为n;

声明一个m*n的二维数组dp,如下图所示;

text1\text2ace
0000
a0
b0
c0
d0
e0

匹配text1、text2

将text1字符与text2逐个对比

当二维数组dp[i][j]位置字符串相同时,dp[i][j] = dp[i-1][j-1]+1;

当二维数组dp[i][j]位置字符串不相同时,dp[i][j] = max(dp[i-1][j],dp[i][j-1])

什么意思呢?

假设'a'和'ace'

1、a与a相同,此时i=1;j=1;dp[i][j] = dp[0][0]+1;

dp[0][0]表示什么意思呢?

dp[0][0]表示之前公共字符串长度

2、a与c不同,此时i=1;j=2;dp[1][2] = Max(dp[0][2] , dp[1][1]);

此时dp[0][2]、dp[1][1]表示什么意思呢?
此时dp[0][2]、dp[1][1]表示之前公共字符串最长的长度

第1步

text1\text2ace
0000
a0111
b0
c0
d0
e0

第2步

text1\text2ace
0000
a0111
b0111
c0
d0
e0

第3步

text1\text2ace
0000
a0111
b0111
c0122
d0
e0

第4步

text1\text2ace
0000
a0111
b0111
c0122
d0122
e0

第5步

text1\text2ace
0000
a0111
b0111
c0122
d0122
e0123

通过上述表格最终得到text1 = "abcde", text2 = "ace" ;最长公共子串长度为3;

当text1 = "abcde", text2 = "ace" 时,m=5;n=3

通过上述表格,出现5副图表,每个图表寻找了3个字符串组层的公共子串长度;

所以该方法时间复杂度为O(mn) 申请了二维数组保存数据;所以空间复杂度为O(mn)