531
最长公共子序列,只不过里面的字母换成单词了,做法是一样的,用的算法导论上的输出方法,输出的时间效率是O(m+n)的,还挺快
//============================================================================
// Name : 531.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string s1[200], s2[200], s;
int num1, num2, ans, t;
int c[200][200], b[200][200];
void Print(int i, int j){
if(i == 0||j == 0) return;
if(b[i][j] == 0){
Print(i-1, j-1);
t++;
if(t == ans) cout << s1[i] << endl;
else cout << s1[i] << " ";
}
else if(b[i][j] == 1){
Print(i-1, j);
}
else Print(i, j-1);
}
int main() {
freopen("a.txt", "r", stdin);
while(cin >> s){
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
num1 = 0;
num2 = 0;
s1[++num1] = s;
while(cin >> s&&s != "#"){
s1[++num1] = s;
}
while(cin >> s&& s != "#"){
s2[++num2] = s;
}
ans = 0;
for(int i = 0;i <= num1;i++) c[i][0] = 0;
for(int j = 0;j <= num2;j++) c[0][j] = 0;
for(int i = 1;i <= num1;i++){
for(int j = 1;j <= num2;j++){
if(s1[i] == s2[j]){
c[i][j] = c[i-1][j-1]+1;
b[i][j] = 0;
}
else if(c[i-1][j] >= c[i][j-1]){
c[i][j] = c[i-1][j];
b[i][j] = 1;
}
else{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
if(ans < c[i][j]){
ans = c[i][j];
}
}
}
t = 0;
Print(num1, num2);
}
return 0;
}

浙公网安备 33010602011771号