http://www.spoj.com/problems/EDIST/
Consider the string SAT .We need to convert it into SAIT
there are 3 possibilities as seen in the picture
So the recursive rule goes like this
dp[i,j]=edit distance for strings of length i and j
dp[i,j]= min(dp[i-1,j-1]+(X[i-1]!=Y[j-1]),dp[i-1,j]+1,dp[i,j-1]+1)
Here X and Y are strings with 0 based index i.e X[i-1] denotes ith character in X
With the base conditions
dp[0,j]=j //just insertions
dp[j,0]=j //just deletions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<string.h> | |
using namespace std; | |
char str1[2001]; | |
char str2[2001]; | |
int dp[2001][2001]; | |
int main(){ | |
int t; | |
cin>>t; | |
while(t--){ | |
cin>>str1>>str2; | |
int d1,d2,d3,i,j,len1,len2; | |
len1=strlen(str1); | |
len2=strlen(str2); | |
for( i=0;i<=len1;i++) | |
dp[i][0]=i; | |
for( j=1;j<=len2;j++) | |
dp[0][j]=j; | |
for( i=1;i<=len1;i++){ | |
for( j=1;j<=len2;j++){ | |
d1=((str1[i-1]==str2[j-1])?0:1)+dp[i-1][j-1];//substitution-->if last character same dont do anything(0) else replace last char(1 | |
d2=dp[i][j-1]+1; // convert (s+ch1) to (t+ch2) by inserting in ch2. so dp (s+ch1,t)+1 +1 for ch2 insertion | |
//insertion-->str2 of j-1 length is converted to | |
d3=dp[i-1][j]+1;//deletion -->convert (s+ch1) to (t+ch2) by deleting ch1 from s.so dp[s,t+ch2]+1 +1 for ch1 deletion | |
//finding minimum of 3 | |
if(d1<d2&&d1<d3) | |
dp[i][j]=d1; | |
else{ | |
if(d2<d3) | |
dp[i][j]=d2; | |
else | |
dp[i][j]=d3; | |
} | |
} | |
} | |
cout<< dp[len1][len2]; | |
cout<<endl; | |
} | |
} |