详解人民搜索面试题-求包含所有query的最短距离
2011-09-28 17:17
357 查看
一篇文章,切完词之后放到一个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,更新最小距离,继续这个过程,直到有一个索引为空为止,最终可以得到最小距离的索引。 废话少说,直接上码:
代码不尽完善,欢迎指正。
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; }
代码不尽完善,欢迎指正。
相关文章推荐
- [经典面试题][腾讯]选择原料工厂(最短距离问题)
- (java)百度笔试之:求从某一点开始遍历所有点的最短距离
- 采用多线程和生产者消费者模式来实现对于一个目录以及所有子目录下的文件内容的搜索,打印出包含指定关键字的行.
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 求有N种颜色的珠子串中包含所有颜色的最短子串
- 搜索文件夹内的所有文件里包含某字符串的linux命令
- SQL 搜索所有包含特定字段的表的数据。
- 图论04——任意指定点到所有其它点的最短路径及距离
- 搜索当前目录下所有文件包含某关键词的文本/文件名/行号
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离
- 一串首尾相连的珠子(m个),有N种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短
- UVa10075 - Airlines(所有点对之间的最短距离)
- 一个字符串中包含另一个字符串所有字符的最短子串
- 一道题:给一个字符串,和一个字符集,求该字符串包含所有字符集的最短子串
- Bellman-Ford的队列优化(求某点到所有点的最短距离)
- Floyd 所有路径的最短距离(c语言)
- 每天一道LeetCode-----在字符串s中找到最短的包含字符串t中所有字符的子串,子串中字符顺序无要求且可以有其他字符
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。