[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VRzZ2jtQ-1587220827026)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1587220609193.png)]
算法:
- 因为要求输出路径,所以需要保存中间过程。
- 由于是连续子串,因此可以保存最大子串条件下的末尾字符的位置,最后根据最大长度输出即可。
- 初次变为最大子串的时候,初始化一个
vector
,后续长度等于最大长度时候,向vector
中添加末尾元素位置。 - 最后根据长度和位置,将所有子串放进容器,排序输出。
代码:
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAX_N = 100;
string a, b;
int dp[MAX_N][MAX_N];
int main()
{
memset(dp, 0, sizeof(dp));
int cnt = 0;
vector<int> ans;
cin >> a >> b;
for (int i = 1; i < a.size() + 1; i++)
{
for (int j = 1; j < b.size() + 1; j++)
{
if (a[i - 1] == b[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
if (cnt < dp[i][j])
{
cnt = dp[i][j];
ans.clear();
ans.push_back(i);
// cout << "insert " << i << " and cnt = " <<cnt <<endl;
}
else if (cnt == dp[i][j])
{
ans.push_back(i);
// cout << "insert " << i <<endl;
}
}
else
{
dp[i][j] = 0;
}
}
}
vector<int>::iterator it;
vector<string> res;
for (it = ans.begin(); it != ans.end(); it++)
{
string s;
for (int i = *it - cnt; i < *it; i++)
{
s += a[i];
}
res.push_back(s);
}
if (cnt == 0)
cout << "NO\n";
else
{
sort(res.begin(), res.end());
for (int i = 0; i < res.size(); i++)
{
cout << res[i] << endl;
}
}
return 0;
}