动态规划
假设两个字符串分别为
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'
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)