他让我在这个程序中输入任何单词,我可以看到一个转换为另一个,但我不知道在哪里插入我想要的单词。我下载了 CodeBlocks,因为它看起来像是 Google 认为最好的 C++ 运行程序,但是当我单击运行时,它只是说我需要两个字符串。猜那意味着单词。
谁能看看这个并告诉我如何插入 2 个单词?
该程序:
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
#define MIN(X,Y) ((X <= Y) ? X:Y)
#define MIN3(A,B,C) ((A <= MIN(B,C)) ? A : MIN(B,C))
class EDIST {
private:
string _s1, _s2;
int _edit_distance;
enum backtrace_pointer { L, D, U };
// L==left, D==diagonal, U==up.
vector<vector<int> > dp_table;
vector<vector<int> > backtrace;
public:
EDIST(const char *a, const char *b) {
_s1 = a;
_s2 = b;
_edit_distance = 0;
}
void run();
private:
int edit_distance() const { return _edit_distance; }
void dp_edit_distance();
void print_dp_tables();
void init_dp_tables();
void print_solution();
};
void EDIST :: print_dp_tables()
{
cout << "\nPrinting dynamic programming table\n";
cout << "\t_";
for ( int i=0; i < _s2.size(); i++ )
cout << "\t" << _s2[i];
cout << endl;
for ( int i=0; i <= _s1.size(); i++ ) {
if ( i ) cout << _s1[i-1];
else cout << "_";
for ( int j=0; j <= _s2.size(); j++ )
cout << "\t" << dp_table[i][j];
cout << endl;
}
cout << "\nPrinting backtrace table\n";
cout << "\t_";
for ( int i=0; i < _s2.size(); i++ )
cout << "\t" << _s2[i];
cout << endl;
for ( int i=0; i <= _s1.size(); i++ ) {
if ( i ) cout << _s1[i-1];
else cout << "_";
for ( int j=0; j <= _s2.size(); j++ ) {
cout << "\t";
if ( backtrace[i][j] == L ) cout << "L";
else if ( backtrace[i][j] == D ) cout << "D";
else cout << "U";
}
cout << endl;
}
}
void EDIST :: init_dp_tables()
{
for ( int i=0; i <= _s1.size(); i++ ) {
vector <int> v;
vector<int> b;
for ( int j=0; j <= _s2.size(); j++ ) {
int n=0, op=0;;
if ( !i ) { n=j; op=L; }
else if ( !j ) { n=i; op=U; }
else { n=0; op=D; }
v.push_back(n);
b.push_back(op);
}
dp_table.push_back(v);
backtrace.push_back(b);
}
for ( int i=0; i <= _s1.size(); i++ )
dp_table[i][0] = i;
for ( int j=0; j <= _s2.size(); j++ )
dp_table[0][j] = j;
}
void EDIST :: dp_edit_distance()
{
for ( int j=1; j <= _s2.size(); j++ ) {
for ( int i=1; i <= _s1.size(); i++ ) {
int a = dp_table[i-1][j]+1;
int b = dp_table[i-1][j-1];
int c = dp_table[i][j-1]+1;
if ( _s1[i-1] != _s2[j-1] )
b++;
dp_table[i][j] = MIN3(a,b,c);
if ( a == dp_table[i][j] ) backtrace[i][j] = U;
else if ( b == dp_table[i][j] ) backtrace[i][j] = D;
else backtrace[i][j] = L;
}
}
}
void EDIST :: print_solution()
{
vector<string> string_sequence;
string_sequence.push_back(_s2);
int i = _s1.size();
int j = _s2.size();
while ( i || j ) {
string s = string_sequence[string_sequence.size()-1];
bool add_string=true;
int new_i=i, new_j=j;
if ( backtrace[i][j] == L ) {//LEFT :: insert
new_j--;
s.erase(j-1,1);
}
else if ( backtrace[i][j] == U ) {//UP : delete
new_i--;
string sub1 = (j >= 1 ? s.substr(0,j) : "");
string sub2 = (j < s.size() ? s.substr(j) : "");
s = sub1 + _s1[i-1] + sub2;
}
else {//DIAGONAL : replace OR no-operation
new_i--;
new_j--;
if ( i && j && dp_table[i][j] != dp_table[new_i][new_j] )
s.replace(j-1,1,_s1.substr(i-1,1));
else
add_string = false;
}
if ( add_string ) {
string_sequence.push_back(s);
_edit_distance++;
}
i = new_i;
j = new_j;
}
cout << "\nEdit distance : " << edit_distance() << endl;
if ( string_sequence.size() )
cout << "\nPrinting mutations : \n";
for ( int i=string_sequence.size()-1; i >= 0; i-- )
cout << "\t" << string_sequence[i] << endl;
}
void EDIST :: run()
{
cout << "\nFinding edit-distance between strings `";
cout << _s1 << "' and `" << _s2 << "'" << endl;
init_dp_tables();
dp_edit_distance();
print_dp_tables();
print_solution();
}
int main(int argc, char *argv[])
{
if ( argc != 3 ) {
cerr << "Need 2 strings as input!\n" << endl;
exit(1);
}
EDIST e(argv[1], argv[2]);
e.run();
return 0;
}