[面试备忘]编程之美-3.5最短摘要

编程之美-3.5最短摘要 p229

View Code
 1 #include <iostream>
2 #include <cassert>
3 #include <cstring>
4
5 //编程之美-3.5最短摘要
6 bool minSumerize(const char (*wordArray)[20], int wordSize, const char (*queryArray)[20], int querySize, int& minStart, int& minEnd)
7 {
8 if (wordArray == NULL || queryArray == NULL) {
9 return false;
10 }
11 minStart = minEnd = -1;
12 int minRange = wordSize;//minimum length
13 for (int outIndex = 0; outIndex < wordSize - querySize + 1; ++outIndex) {
14 if (!strcmp(wordArray[outIndex], queryArray[0])) {//the (outIndex + 1)th word match the first queryword
15 //find the rest match in wordArray
16 for (int inIndex = outIndex + 1, queryIndex = 1; inIndex != wordSize; ++inIndex) {
17 if (!strcmp(wordArray[inIndex], queryArray[queryIndex])) {//a new matching word found
18 if (++queryIndex == querySize) {//is it the last word in queryArray?
19 if ((inIndex - outIndex) < minRange) {//is the minimum match?
20 minRange = inIndex - outIndex;
21 minStart = outIndex;
22 minEnd = inIndex;
23 break;
24 }
25 }
26 }
27 }
28 }
29 //find the next word match the first query word.
30 }
31 return minRange != wordSize;
32 }
33
34 int main()
35 {
36 char wordArray[][20] = { "pure", "useless", "what", "is", "MS", "what", "nice", "a", "day", "nice", "day", "by", "day" };
37 char queryArray[][20] = { "what", "a", "nice", "day" };
38 int minStart = -1, minEnd = -1;
39 if (minSumerize(wordArray, sizeof(wordArray) / sizeof(*wordArray),
40 queryArray, sizeof(queryArray) / sizeof(*queryArray), minStart, minEnd)) {
41 std::cout << minStart << ' ' << minEnd << std::endl;
42 }
43 return 0;
44 }

当找到待查询关键字中第一个词在分词数组中的一个匹配,找到第一个完整的匹配肯定也是以这个词为开始的最短摘要。

在分词数组中至多遍历size - 关键字长度 + 1次后便可球出最短匹配。

posted @ 2011-09-01 00:32  lifengzhong  阅读(187)  评论(0编辑  收藏  举报