diff --git a/Dynamic Programming/Edit Distance.cpp b/Dynamic Programming/Edit Distance.cpp new file mode 100644 index 000000000..d99d03c5a --- /dev/null +++ b/Dynamic Programming/Edit Distance.cpp @@ -0,0 +1,87 @@ +/* Given two strings str1 & str2 + * and below operations that can + * be performed on str1. Find + * minimum number of edits + * (operations) required to convert + * 'str1' into 'str2'/ + * a. Insert + * b. Remove + * c. Replace + * All of the above operations are + * of equal cost + */ + +#include +#include +using namespace std; + +int min(int x, int y, int z){ + return min(min(x,y), z); +} + +/* A Naive recursive C++ program to find + * minimum number of operations to convert + * str1 to str2. + * O(3^m) + */ +int editDist(string str1, string str2, int m, int n) { + if(m == 0) return n; + if(n == 0) return m; + + //If last characters are same then continue + //for the rest of them. + if(str1[m-1] == str2[n-2]) + return editDist(str1, str2, m-1, n-1); + + //If last not same, then 3 possibilities + //a.Insert b.Remove c. Replace + //Get min of three and continue for rest. + return 1 + min ( editDist(str1, str2, m, n-1), + editDist(str1, str2, m-1, n), + editDist(str1, str2, m-1, n-1) + ); +} + +/* A DP based program + * O(m x n) + */ +int editDistDP(string str1, string str2, int m, int n) { + + //Create Table for SubProblems + int dp[m+1][n+1]; + + //Fill d[][] in bottom up manner + for(int i=0; i<=m; i++) { + for(int j=0; j<=n; j++) { + //If str1 empty. Then add all of str2 + if(i==0) + dp[i][j] = j; + + //If str2 empty. Then add all of str1 + else if(j==0) + dp[i][j] = i; + + //If character same. Recur for remaining + else if(str1[i-1] == str2[j-1]) + dp[i][j] == dp[i-1][j-1]; + + else + dp[i][j] = 1 + min(dp[i][j-1],//Insert + dp[i-1][j],//Remove + dp[i-1][j-1]//Replace + ); + } + } + + return dp[m][n]; +} + +int main() { + string str1 = "sunday"; + string str2 = "saturday"; + + cout << editDist(str1, str1, str1.length(), str2.length()) << endl; + cout << editDistDP(str1, str1, str1.length(), str2.length()) << endl; + + return 0; +}