Cho một mảng các từ words và hai từ word1, word2 (có thể trùng nhau). Tìm khoảng cách ngắn nhất giữa hai từ này trong mảng. Hai từ đại diện cho hai vị trí riêng biệt (ngay cả khi chúng giống nhau).
Ví dụ
Đầu vào: words = ["practice", "makes", "perfect", "skill", "makes"], word1 = "makes", word2 = "skill"
Đầu ra: 1 (vị trí 3 và 4).
Thuật toán quét một lần (One-pass)
Duy trì hai biến last1, last2 lưu vị trí gần nhất của word1 và word2. Khi gặp từ khớp:
- Nếu
word1 == word2: cập nhậtlast1 = last2trước, sau đólast2 = i(đảm bảo hai vị trí khác nhau). - Nếu khác nhau: cập nhật biến tương ứng.
- Mỗi bước cập nhật kết quả
ans = min(ans, abs(last1 - last2)).
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int shortestWordDistance(vector<string>& words, string word1, string word2) {
int ans = INT_MAX;
int last1 = INT_MAX, last2 = INT_MIN;
for (int i = 0; i < words.size(); ++i) {
if (words[i] == word1) last1 = i;
if (words[i] == word2) {
if (word1 == word2) last1 = last2;
last2 = i;
}
if (last1 != INT_MAX && last2 != INT_MIN)
ans = min(ans, abs(last1 - last2));
}
return ans;
}
};
Độ phức tạp
- Thời gian: O(N) - duyệt mảng một lần.
- Không gian: O(1) - chỉ dùng vài biến phụ.
Kết quả kiểm thử
Đầu vào: {"practice", "makes", "perfect", "skill", "makes"}, "makes", "skill"
Đầu ra: 1