1.dp矩阵,
第一行/列 若对应字符相同为1,否则为0
其余行/列 若对应字符相同,则为左上角元素加1
2.设置max_val记录最长的公共字串的长度,并设置flag_i,flag_j为最长公共字串末尾字符在dp矩阵中的位置
3.根据max_val及flag_i,flag_j输出最长公共字串
代码如下:
/*
任意多个字符串中最长的公共子串
*/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s1, s2;
cin >> s1 >> s2;
int m = s1.size();
int n = s2.size();
int flag_i = 0;
int flag_j = 0;
int max_val = 0;
vector<vector<int>> dp(m,vector<int>(n,0));
for (int i = 0; i < n; i++)
{
if (s1[0] == s2[i])
dp[0][i] = 1;
}
for (int i = 0; i < m; i++)
{
if (s1[i] == s2[0])
dp[i][0] = 1;
}
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
if (s1[i] == s2[j])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > max_val)
{
max_val = dp[i][j];
flag_i = i;
flag_j = j;
}
}
}
}
//output
string res;
for (int i = max_val; i >= 1; i--)
{
res.push_back(s1[flag_i]);
flag_i--;
}
for (int i = res.size() - 1; i >= 0; i--)
{
cout << res[i] << " ";
}
cout << endl;
return 0;
}