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ữaS[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