#include<iostream>
#include<algorithm>
#include<string>
#include<cassert>
#include<fstream>
using namespace std;
char s1[100];
char s2[100];
int dp[105][105] = { 0 };
int s1_len;
int s2_len;
/* 求出两文件的最长子序列 */
int LCS()
{
s1_len = strlen(s1);
s2_len = strlen(s2);
cout << s1_len << " " << s2_len << endl;
for (int i = 1; i <= s1_len; i++)
{
for (int j = 1; j <= s2_len; j++)
{
if (s1[i - 1] == s2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
return dp[s1_len][s2_len];
}
/* 打印最长子序列内容 */
void Print(int i, int j)
{
if (i == -1 || j == -1)
return;
if (s1[i] == s2[j])
{
Print(i - 1, j - 1);
cout << s1[i];
}
else
{
if (dp[i - 1][j] > dp[i][j - 1])
Print(i - 1, j);
else
Print(i, j - 1);
}
}
int main()
{
string file_name1("s1.txt");
string file_name2("s2.txt");
ifstream fin;
fin.open(file_name1.data());
if (!fin.is_open())
{
cout << file_name1 << " 无法打开\n";
return -1;
}
fin.getline(s1, 100);
fin.close();
fin.open(file_name2.data());
if (!fin.is_open())
{
cout << file_name2 << " 无法打开\n";
return -1;
}
fin.getline(s2, 100);
fin.close();
int lcs = LCS();
cout << "最长公共子序列长度为:" << lcs << endl;
cout << "最长公共子序列为:";
Print(s1_len - 1, s2_len - 1);
cout << "\n相似度为:" << (lcs * 2 * 100) / (s1_len + s2_len) << "%\n";
return 0;
}
此算法是针对最长公共子序列,不是子串。
具体情况远不止如此简单,还要考虑相似度基于的是字符还是单词,具体算法看实际情况。