Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình tìm khoảng cách chỉnh sửa tối thiểu giữa hai chuỗi trong C++


Cho hai từ S và T. Tìm số phép toán tối thiểu để biến S thành T. Ba phép toán: chèn, xóa, thay thế một ký tự (Levenshtein distance).

Ví dụ: "evaluate" và "fluctuate" → 5.

Thuật toán (Quy hoạch động - Edit Distance)

  • Ma trận dp[i][j]: khoảng cách giữa S[0..i-1] và T[0..j-1].
  • Khởi tạo: dp[0][j] = j, dp[i][0] = i.
  • Nếu S[i-1] == T[j-1]: dp[i][j] = dp[i-1][j-1].
  • Ngược lại: dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) (xóa, chèn, thay).
  • Trả về dp[n][m].

Ví dụ triển khai (C++)

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int minDistance(string s, string t) {
        int n = s.size(), m = t.size();
        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
        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 (s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1];
                else dp[i][j] = 1 + min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});
        return dp[n][m];
    }
};

int main() {
    Solution ob;
    cout << ob.minDistance("fluctuate", "evaluate");
    return 0;
}

Đầu vào

"fluctuate" "evaluate"

Đầu ra

5