Cho hai chuỗi s và t. Kiểm tra xem chúng có cách nhau đúng một khoảng cách chỉnh sửa hay không. Ba loại phép chỉnh sửa: chèn, xóa, hoặc thay thế một ký tự.
Ví dụ
Đầu vào: s = "ab", t = "acb"
Đầu ra: true (chèn 'c' vào s).
Thuật toán so sánh tuyến tính
- Đảm bảo
sdài hơn hoặc bằngt(hoán đổi nếu cần). - Duyệt đồng thời đến khi tìm thấy ký tự khác nhau tại vị trí
i. - Nếu độ dài bằng nhau: phần còn lại sau
iphải giống hệt nhau (thay thế). - Nếu
sdài hơn: phần còn lại củastừi+1phải khớp với phần còn lại củattừi(chèn vào t / xóa khỏi s). - Nếu duyệt hết
tkhông thấy khác biệt:sphải dài hơn đúng 1 ký tự (chèn cuối).
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isOneEditDistance(string s, string t) {
if (s.size() < t.size()) return isOneEditDistance(t, s);
int n = s.size(), m = t.size();
for (int i = 0; i < m; ++i) {
if (s[i] != t[i]) {
if (n == m) return s.substr(i+1) == t.substr(i+1);
return s.substr(i+1) == t.substr(i);
}
}
return m + 1 == n;
}
};
Độ phức tạp
- Thời gian: O(min(N, M)) - dừng sớm khi tìm thấy khác biệt.
- Không gian: O(1) - không dùng bộ nhớ thêm (substr trong C++ có thể copy, có thể tối ưu bằng con trỏ).
Kết quả kiểm thử
Đầu vào: s = "ab", t = "acb"
Đầu ra: 1 (true)