LCS(字符串dp)
题意就是给两个字符串 s 和 t,然后问你他们两最长的公共子串。
-
思路

得到dp之后,再循环遍历一下,输出就行了
-
代码
点击查看代码
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<math.h>
#include<stack>
#include<map>
#include<list>
#include<unordered_set>
#include<unordered_map>
#define endl '\n';
//#define int long long;
using namespace std;
typedef long long ll;
const int N = 2e4+10;
int n, m, k;
int dp[N][N];
void sovle(){
string s, t;
cin >> s >> t;
int lens = s.length();
int lent = t.length();
for (int i = lens-1; i >= 0; i --){
for (int j = lent-1; j >= 0; j --){
if (s[i] == t[j]){
dp[i][j] = dp[i+1][j+1] + 1;
}
else {
dp[i][j] = max(dp[i+1][j], dp[i][j+1]);
}
}
}
for (int i = 0, j = 0; i < lens && j < lent;){
if (s[i] == t[j]){
cout << s[i];
i ++;
j ++;
}
else if (dp[i][j] == dp[i+1][j]){
i++;
}
else {
j++;
}
}
}
int main()
{
int t = 1;
//scanf("%d", &t);
while (t --){
sovle();
}
return 0;
}

浙公网安备 33010602011771号