#include <iostream>
#include <cctype>
using namespace std;
int min( int a, int b)
{
if ( a < b)
return a;
else
return b;
}
int main( )
{
string s1, s2;
cout << "Hello, Welcome to the Edit Distance Demonstration" << endl;
cout << "=====================================================" << endl;
cout << "Please input the first word: " ;
cin >> s1;
cout << "Please input the second word: " ;
cin >> s2;
int l1 = s1.size ( ) , l2 = s2.size ( ) ;
int edit_dist[ 1000 ] [ 1000 ] ;
for ( int i = 0 ; i <= l1; i++ )
{
for ( int j = 0 ; j <= l2; j++ )
{
if ( i == 0 )
edit_dist[ i] [ j] = j;
else if ( j == 0 )
edit_dist[ i] [ j] = i;
else if ( s1[ i - 1 ] == s2[ j - 1 ] )
{
edit_dist[ i] [ j] = edit_dist[ i - 1 ] [ j - 1 ] ;
} else
edit_dist[ i] [ j] = 1 + min( edit_dist[ i] [ j - 1 ] , min( edit_dist[ i - 1 ] [ j] , edit_dist[ i - 1 ] [ j - 1 ] ) ) ;
}
}
cout << "The Output Matrix:" << endl;
cout << "+" ;
for ( int j = 0 ; j <= l2; j++ )
{
cout << "----+" ;
}
cout << endl;
for ( int i = 0 ; i <= l1; i++ )
{
cout << "| " ;
for ( int j = 0 ; j <= l2; j++ )
{
cout << edit_dist[ i] [ j] << " | " ;
}
cout << endl;
cout << "+" ;
for ( int j = 0 ; j <= l2; j++ )
{
cout << "----+" ;
}
cout << endl;
}
cout << "The edit distance is: " << edit_dist[ l1] [ l2] << endl;
// Alignment
cout << "Alignment is: " ;
int i = l1, j = l2;
while ( i > 0 && j > 0 )
{
if ( s1[ i - 1 ] == s2[ j - 1 ] )
{
cout << s1[ i - 1 ] ;
i-- ;
j-- ;
} else if ( edit_dist[ i] [ j] == edit_dist[ i - 1 ] [ j - 1 ] + 1 )
{
cout << s1[ i - 1 ] ;
i-- ;
j-- ;
} else if ( edit_dist[ i] [ j] == edit_dist[ i] [ j - 1 ] + 1 )
{
cout << "_" ;
j-- ;
} else
{
cout << "_" ;
i-- ;
}
}
while ( i > 0 )
{
cout << s1[ i - 1 ] ;
i-- ;
}
while ( j > 0 )
{
cout << "_" ;
j-- ;
}
cout << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2N0eXBlPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1pbihpbnQgYSwgaW50IGIpIAp7CiAgICBpZiAoYSA8IGIpCiAgICAgICAgcmV0dXJuIGE7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIGI7Cn0KCmludCBtYWluKCkgCnsKICAgIHN0cmluZyBzMSwgczI7CgogICAgY291dCA8PCAiSGVsbG8sIFdlbGNvbWUgdG8gdGhlIEVkaXQgRGlzdGFuY2UgRGVtb25zdHJhdGlvbiIgPDwgZW5kbDsKICAgIGNvdXQgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiA8PCBlbmRsOwogICAgY291dCA8PCAiUGxlYXNlIGlucHV0IHRoZSBmaXJzdCB3b3JkOiAiOwogICAgY2luID4+IHMxOwogICAgY291dCA8PCAiUGxlYXNlIGlucHV0IHRoZSBzZWNvbmQgd29yZDogIjsKICAgIGNpbiA+PiBzMjsKCiAgICBpbnQgbDEgPSBzMS5zaXplKCksIGwyID0gczIuc2l6ZSgpOwogICAgaW50IGVkaXRfZGlzdFsxMDAwXVsxMDAwXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBsMTsgaSsrKSAKICAgIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBsMjsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGkgPT0gMCkKICAgICAgICAgICAgICAgIGVkaXRfZGlzdFtpXVtqXSA9IGo7CiAgICAgICAgICAgIGVsc2UgaWYgKGogPT0gMCkKICAgICAgICAgICAgICAgIGVkaXRfZGlzdFtpXVtqXSA9IGk7CiAgICAgICAgICAgIGVsc2UgaWYgKHMxW2kgLSAxXSA9PSBzMltqIC0gMV0pIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlZGl0X2Rpc3RbaV1bal0gPSBlZGl0X2Rpc3RbaSAtIDFdW2ogLSAxXTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBlZGl0X2Rpc3RbaV1bal0gPSAxICsgbWluKGVkaXRfZGlzdFtpXVtqIC0gMV0sIG1pbihlZGl0X2Rpc3RbaSAtIDFdW2pdLCBlZGl0X2Rpc3RbaSAtIDFdW2ogLSAxXSkpOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8ICJUaGUgT3V0cHV0IE1hdHJpeDoiIDw8IGVuZGw7CiAgICBjb3V0IDw8ICIrIjsKICAgIGZvciAoaW50IGogPSAwOyBqIDw9IGwyOyBqKyspIAogICAgewogICAgICAgIGNvdXQgPDwgIi0tLS0rIjsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGwxOyBpKyspIAogICAgewogICAgICAgIGNvdXQgPDwgInwgIjsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBsMjsgaisrKSAKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgZWRpdF9kaXN0W2ldW2pdIDw8ICIgfCAiOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgY291dCA8PCAiKyI7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gbDI7IGorKykgCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICItLS0tKyI7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgZW5kbDsKICAgIH0KCiAgICBjb3V0IDw8ICJUaGUgZWRpdCBkaXN0YW5jZSBpczogIiA8PCBlZGl0X2Rpc3RbbDFdW2wyXSA8PCBlbmRsOwoKICAgIC8vIEFsaWdubWVudAogICAgY291dCA8PCAiQWxpZ25tZW50IGlzOiAiOwogICAgaW50IGkgPSBsMSwgaiA9IGwyOwogICAgd2hpbGUgKGkgPiAwICYmIGogPiAwKSAKICAgIHsKICAgICAgICBpZiAoczFbaSAtIDFdID09IHMyW2ogLSAxXSkgCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8IHMxW2kgLSAxXTsKICAgICAgICAgICAgaS0tOwogICAgICAgICAgICBqLS07CiAgICAgICAgfSBlbHNlIGlmIChlZGl0X2Rpc3RbaV1bal0gPT0gZWRpdF9kaXN0W2kgLSAxXVtqIC0gMV0gKyAxKSAKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgczFbaSAtIDFdOwogICAgICAgICAgICBpLS07CiAgICAgICAgICAgIGotLTsKICAgICAgICB9IGVsc2UgaWYgKGVkaXRfZGlzdFtpXVtqXSA9PSBlZGl0X2Rpc3RbaV1baiAtIDFdICsgMSkgCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJfIjsKICAgICAgICAgICAgai0tOwogICAgICAgIH0gZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgIl8iOwogICAgICAgICAgICBpLS07CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKGkgPiAwKSAKICAgIHsKICAgICAgICBjb3V0IDw8IHMxW2kgLSAxXTsKICAgICAgICBpLS07CiAgICB9CiAgICB3aGlsZSAoaiA+IDApIAogICAgewogICAgICAgIGNvdXQgPDwgIl8iOwogICAgICAgIGotLTsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQoKCiA=