如题目所说:求两个字符串的最长公共子串及其长度。比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。
【思路】
这是一道动态规划的题
1、把两个字符串分别以行和列组成一个二维矩阵。
2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。
3、通过查找出值为1的最长对角线就能找到最长公共子串。
针对于上面的两个字符串,我们可以得到一个二维矩阵:
从上图可以看到,str1和str2共有5个公共子串,最长的公共子串长度为5。
【优化】
为了进一步优化算法的效率,我们可以再计算某个二维矩阵的值的时候顺便计算出来当前最长的公共子串的长度,即某个二维矩阵元素的值由dp[i][j]=1演变为dp[i][j]=1 +dp[i-1][j-1],这样就避免了后续查找对角线长度的操作了。得到方程:dp[i][j]=dp[i-1][j-1]+1
修改后的二维矩阵如下:
【C++代码】
#include<bits/stdc++.h>
using namespace std;
int dp[1000][1000];
int main()
{
string s1,s2;
cin