สมมติว่าเรามีรายการคำ และอีกสองคำคือ word1 และ word2 เราต้องหาระยะทางสั้นที่สุดระหว่างสองคำนี้ในรายการ word1 และ word2 อาจเป็นคำเดียวกันก็ได้ และแสดงถึงคำสองคำที่ต่างกันในรายการ
ตัวอย่าง: words = ["practice", "makes", "perfect", "skill", "makes"], word1 = "makes", word2 = "skill" ผลลัพธ์ = 1
วิธีแก้ปัญหา
- เก็บตำแหน่งล่าสุดของ word1 (l1) และ word2 (l2)
- วนลูปผ่านรายการคำ:
- ถ้าเจอ word1 อัปเดต l1
- ถ้าเจอ word2 อัปเดต l2 (ถ้า word1==word2 ให้ l1 = l2 ก่อน)
- คำนวณระยะทาง |l2 - l1| และอัปเดตค่าต่ำสุด
- คืนค่าระยะทางต่ำสุด
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int shortestWordDistance(vector<string>& words, string word1, string word2) {
int ret = 1e9;
int l1 = 1e9;
int l2 = -1e9;
int n = words.size();
for (int i = 0; i < n; i++) {
if (words[i] == word1) {
l1 = i;
}
if (words[i] == word2) {
if (word1 == word2) {
l1 = l2;
}
l2 = i;
}
ret = min(abs(l2 - l1), ret);
}
return ret;
}
};
int main(){
Solution ob;
vector<string> v = {"practice", "makes", "perfect", "skill", "makes"};
cout << (ob.shortestWordDistance(v, "makes", "skill"));
}ข้อมูลนำเข้า
{"practice", "makes", "perfect", "skill", "makes"},"makes", "skill"ผลลัพธ์
1