【算法2】最长公共子序列
https://blog.****.net/someone_and_anyone/article/details/81044153
https://www.cnblogs.com/gispf/p/6733074.html(讲解了最长公共子串、最长公共子序列、字符串相似度)
#define N 1010
int dp[N][N];
char c;
int main()
{
char a[N];
char b[N];
scanf("%s%s",a,b);
int la=strlen(a);
int lb=strlen(b);
memset(dp,0,sizeof(dp));
for(int i=1; i<=la; i++)
{
for(int j=1; j<=lb; j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}//dp[la][lb]即为子序列长度
int i=la,j=lb;
stack<char>s;
while(dp[i][j])
{
if(dp[i][j]==dp[i-1][j])///来自于左方向
{
i--;
}
else if(dp[i][j]==dp[i][j-1])///来自于上方向
{
j--;
}
else if(dp[i][j]>dp[i-1][j-1])///来自于左上方向
{
i--;
j--;
s.push(a[i]);
}
}
while(!s.empty())
{
c=s.top();
printf("%c",c);
s.pop();
}
system("pause");
return 0;
}
//第六十三题 查找两个字符串a,b中的最长公共子串
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
if (str1.size()>str2.size())
swap(str1, str2);
int len1 = str1.size(), len2 = str2.size(), i, j, start = 0, max = 0;
vector<vector<int>>dp(len1 + 1, vector<int>(len2 + 1, 0));
for (i = 1; i <= len1; i++)
for (j = 1; j <= len2; j++)
{
if (str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j]>max)
{
max = dp[i][j];
start = i - max;
}
}
cout << str1.substr(start, max) << endl;
}
return 0;
}