int solve(string &str1, string &str2,int i,int j){
int n1=str1.size(), n2=str2.size();
if(i>=n1) return n2-j;
if(j>=n2) return n1-i;
int ans=0;
if(str1[i] == str2[j]){
ans = solve(str1, str2, i+1, j+1);
}else{
int Insert =1+solve(str1, str2, i, j+1);
int Delete =1+solve(str1, str2, i+1, j);
int Replace =1+solve(str1, str2, i+1, j+1);
ans =min(Delete, min(Insert,Replace) );
}
return ans;
}
int editDistance(string str1, string str2)
{
//write you code here
return solve(str1, str2,0,0);
}
int solve1(string &str1, string &str2,int i,int j,vector<vector<int> >&dp){
int n1=str1.size(), n2=str2.size();
if(i>=n1) return n2-j;
if(j>=n2) return n1-i;
if(dp[i][j] != -1){
return dp[i][j];
}
int ans=0;
if(str1[i] == str2[j]){
ans= solve1(str1, str2, i+1, j+1,dp);
}else{
int Insert =1+solve1(str1, str2, i, j+1,dp);
int Delete =1+solve1(str1, str2, i+1, j,dp);
int Replace =1+solve1(str1, str2, i+1, j+1,dp);
ans =min(Delete, min(Insert,Replace) );
}
return dp[i][j] =ans;
}
int editDistance(string str1, string str2)
{
//write you code here
vector<vector<int> >dp( str1.size(), vector<int>(str2.size(),-1) );
return solve1(str1,str2,0,0,dp);
}
int solve2(string &str1, string &str2){
vector<vector<int> >dp(str1.size()+1, vector<int>(str2.size()+1,0) );
for(int j=0; j<str2.size(); j++){
dp[str1.size()][j] = str2.size()-j;
}
for(int i=0; i<str1.size(); i++){
dp[i][str2.size()]= str1.size()-i;
}
for(int i=str1.size()-1; i>=0; i--){
for(int j=str2.size()-1; j>=0; j--){
int ans=0;
if(str1[i] == str2[j]){
ans= dp[i+1][j+1];
}else{
int Insert =1+dp[ i][j+1];
int Delete =1+dp[ i+1][j];
int Replace =1+dp[ i+1][j+1];
ans =min(Delete, min(Insert,Replace) );
}
dp[i][j] =ans;
}
}
return dp[0][0];
}
int editDistance(string str1, string str2)
{
//write you code here
return solve2(str1, str2);
}
int solve3(string &str1, string &str2){
vector<int>curr(str2.size()+1,0);
vector<int>next(str2.size()+1,0);
for(int j=0; j<str2.size(); j++){
next[j] = str2.size()-j;
}
for(int i=str1.size()-1; i>=0; i--){
for(int j=str2.size()-1; j>=0; j--){
// imp
curr[str2.size()] = str1.size()-i;
int ans=0;
if(str1[i] == str2[j]){
ans= next[j+1];
}else{
int Insert =1+curr[j+1];
int Delete =1+next[j];
int Replace =1+next[j+1];
ans =min(Delete, min(Insert,Replace) );
}
curr[j] =ans;
}
next =curr;
}
return next[0];
}
int editDistance(string str1, string str2)
{
//write you code here
return solve3(str1,str2);
}