詳解人民搜尋面試題 求包含所有query的最短距離

2021-09-07 23:53:03 字數 1185 閱讀 7730

一篇文章,切完詞之後放到乙個vector中,乙個查詢切完詞也放到乙個vector中,寫乙個函式找出這篇文章中包含這個查詢中所有詞的最小區間的i和j。只要返回第乙個即可。

當時很坑爹,直覺告訴我要建索引,而且建索引也對了,但是建完之後就不知道怎麼搞了,後台他提示一句,有些是不需要比較的,才得到靈感,想出了解決辦法,但是寫起**來,又掉鍊子了,可能是在紙上寫**沒有什麼經驗吧,在電腦上,我寫**還是很快了。

言歸正傳,建索引的思路是對的。怎麼建索引呢?

對於每個query**現的詞,建立索引,當然在實際應用中,可能是對文件**現的所有詞進行建索引。所謂建索引,就是記錄query中每個詞在doc**現的位置。

比如一篇文件為「a b a a c d e f a f」,query為「a e f」,那麼我們建立索引為:

a: 0 2 3 8

e: 6

f:7 9

那麼下邊如何搞呢?

首先看索引的第一排,0 6 7,找出最大和最小為7和0,距離為7,那麼0 6 9還有沒有必要比較呢?答案是否定的,那當然也就有思路了,比較了0 6 7之後,0就可以刪除了,下面比較2 6 7,最小為2,最大為7,距離為5,更新最小距離,繼續這個過程,直到有乙個索引為空為止,最終可以得到最小距離的索引。

廢話少說,直接上碼:

#include 

#include

#include

#include

using namespace std;

bool find_shortest_distance(const vector &doc, const vector &query, int &i, int &j)

} if (q.empty())

index.push_back(q);

} // 求解的過程

int min, max;

int dis = doc.size() + 1;

while (true)

else if (front > max)

}int diff = max - min;

if (diff < dis)

minit->pop();

if (minit->empty())

}return true;

}int main()

**不盡完善,歡迎指正。

面試題 HashMap詳解

先上hashcode和equals原始碼 jni,呼叫底層其它語言實現 public native inthashcode 預設同 直接比較物件 public boolean equals object obj equals方法 string類中重寫了equals方法,比較的是字串值,看一下原始碼實...

MRO super面試題 詳解

class init object def init self,v print init self.val v class add2 init def init self,val print add2 super add2,self init val print self.val self.val ...

面試題17 17 多次搜尋

給定乙個較長字串big和乙個包含較短字串的陣列smalls,設計乙個方法,根據smalls中的每乙個較短字串,對big進行搜尋。輸出smalls中的字串在big裡出現的所有位置positions,其中positions i 為smalls i 出現的所有位置 輸入 big mississippi s...