Complete-Preparation

πŸŽ‰ One-stop destination for all your technical interview Preparation πŸŽ‰

View the Project on GitHub

Edit Distance 🌟🌟🌟

Recursive Approach

Code-1

int f(string& s, string& t, int i, int j)
{
    if (i < 0) return j + 1;
    if (j < 0) return i + 1;

    if (s[i] == t[j]) return f(s, t, i - 1, j - 1);

    int insert = f(s, t, i, j - 1);
    int del = f(s, t, i - 1, j);
    int replace = f(s, t, i - 1, j - 1);

    return 1 + min(insert, min(del, replace));
}

int editDistance(string str1, string str2)
{
    int n = str1.size(), m = str2.size();
    return f(str1, str2, n - 1, m - 1);
}

Code-2

int f(string& s, string& t, int i, int j)
{
    // 1 based indexing solution
    if (i == 0) return j;
    if (j == 0) return i;

    if (s[i - 1] == t[j - 1]) return f(s, t, i - 1, j - 1);

    int insert = f(s, t, i, j - 1);
    int del = f(s, t, i - 1, j);
    int replace = f(s, t, i - 1, j - 1);

    return 1 + min(insert, min(del, replace));
}

int editDistance(string str1, string str2)
{
    int n = str1.size(), m = str2.size();
    return f(str1, str2, n, m);
}

Memoization

Code

int f(string& s, string& t, int i, int j, vector<vector<int>>& dp)
{
    // 1 based indexing solution
    if (i == 0) return j;
    if (j == 0) return i;

    if (dp[i][j] != -1) return dp[i][j];

    if (s[i - 1] == t[j - 1]) return f(s, t, i - 1, j - 1, dp);

    int insert = f(s, t, i, j - 1, dp);
    int del = f(s, t, i - 1, j, dp);
    int replace = f(s, t, i - 1, j - 1, dp);

    return dp[i][j] = 1 + min(insert, min(del, replace));
}

int editDistance(string str1, string str2)
{
    int n = str1.size(), m = str2.size();
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, -1));
    return f(str1, str2, n, m, dp);
}

Tabulation(bottom-up)

Code

int editDistance(string str1, string str2)
{
    int n = str1.size(), m = str2.size();
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));

    for (int i = 0; i <= n; i++) dp[i][0] = i;
    for (int j = 0; j <= m; j++) dp[0][j] = j;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (str1[i - 1] == str2[j - 1])
                dp[i][j] = dp[i - 1][j - 1];
            else
                dp[i][j] = 1 + min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1]));
        }
    }
    return dp[n][m];
}

Space optimization

Code

int editDistance(string str1, string str2)
{
    int n = str1.size(), m = str2.size();
    vector<int> prev(m + 1, 0), curr(m + 1, 0);

    for (int j = 0; j <= m; j++) prev[j] = j; // base case 2

    for (int i = 1; i <= n; i++) {
        curr[0] = i; // base case 1
        for (int j = 1; j <= m; j++) {
            if (str1[i - 1] == str2[j - 1])
                curr[j] = prev[j - 1];
            else
                curr[j] = 1 + min({ prev[j], curr[j - 1], prev[j - 1] });
        }
        prev = curr;
    }
    return prev[m];
}