/* 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 - 1]) 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, str2, str1.length(), str2.length()) << endl; cout << editDistDP(str1, str2, str1.length(), str2.length()) << endl; return 0; }