详解人民搜索面试题-求包含所有query的最短距离
一篇文章,切完词之后放到一个vector<string>中,一个查询切完词也放到一个vector<string>中,写一个函数找出这篇文章中包含这个查询中所有词的最小区间的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)
{
// 索引的过程
vector > index;
for (vector::const_iterator qit = query.begin(); qit != query.end(); qit++)
{
queue q;
for (vector::const_iterator dit = doc.begin(); dit != doc.end(); dit++)
{
if (*qit == *dit)
{
q.push(dit - doc.begin());
}
}
if (q.empty())
{
return false;
}
index.push_back(q);
}
// 求解的过程
int min, max;
int dis = doc.size() + 1;
while (true)
{
min = max = index[0].front();
vector >::iterator minit = index.begin();
for (vector >::iterator it = index.begin(); it != index.end(); it++)
{
int front = it->front();
if (front < min)
{
min = front;
minit = it;
}
else if (front > max)
{
max = front;
}
}
int diff = max - min;
if (diff < dis)
{
dis = diff;
i = min;
j = max;
}
minit->pop();
if (minit->empty())
{
break;
}
}
return true;
}
int main()
{
vector doc, query;
doc.push_back("a");
doc.push_back("b");
doc.push_back("a");
doc.push_back("a");
doc.push_back("c");
doc.push_back("d");
doc.push_back("e");
doc.push_back("f");
doc.push_back("a");
doc.push_back("f");
query.push_back("a");
query.push_back("e");
query.push_back("f");
int i, j;
find_shortest_distance(doc, query, i, j);
cout << i << '\t' << j << endl;
return 0;
}
代码不尽完善,欢迎指正。

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名小橋流水(包含链接)。如您有任何疑问或者授权方面的协商,请给我发邮件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述