《算法导论》中的标准解答,构造的方向键用0, 1, 2来表示。
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
class Solution {
public:
string LCS(string s1, string s2) {
int n1 = s1.size(), n2 = s2.size();
if(n1==0 || n2==0)
return "-1";
vector<vector<int>> dp(n1+1, vector<int>(n2+1));
vector<vector<int>> m(n1+1, vector<int>(n2+1));
for(int i=1; i<=n1; i++) {
for(int j=1; j<=n2; j++) {
if(s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
}
else if(dp[i-1][j] >= dp[i][j-1]) {
dp[i][j] = dp[i-1][j];
m[i][j] = 1;
}
else {
dp[i][j] = dp[i][j-1];
m[i][j] = 2;
}
}
}
string ans;
int i=n1, j=n2;
while(i && j) {
if(m[i][j] == 0) {
ans.push_back(s1[i-1]);
i--, j--;
}
else if(m[i][j] == 1)
i--;
else
j--;
}
if(ans.size() == 0)
return "-1";
reverse(ans.begin(), ans.end());
return ans;
}
};

京公网安备 11010502036488号