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;
}
posted @ 2023-09-24 16:05  shunn  阅读(48)  评论(0)    收藏  举报