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

1143. 最长公共子序列

动态规划

假设两个字符串分别为

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

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

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

text1\text2 a c e
0 0 0 0
a 0
b 0
c 0
d 0
e 0

匹配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'

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

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\text2 a c e
0 0 0 0
a 0 1 1 1
b 0
c 0
d 0
e 0

第2步

text1\text2 a c e
0 0 0 0
a 0 1 1 1
b 0 1 1 1
c 0
d 0
e 0

第3步

text1\text2 a c e
0 0 0 0
a 0 1 1 1
b 0 1 1 1
c 0 1 2 2
d 0
e 0

第4步

text1\text2 a c e
0 0 0 0
a 0 1 1 1
b 0 1 1 1
c 0 1 2 2
d 0 1 2 2
e 0

第5步

text1\text2 a c e
0 0 0 0
a 0 1 1 1
b 0 1 1 1
c 0 1 2 2
d 0 1 2 2
e 0 1 2 3

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

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

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

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

猜你喜欢

转载自juejin.im/post/7030812918593617928