找到最短的子段

时间:2012-06-30 07:28:45

标签: string algorithm

我想知道我应该使用哪种算法。

他们是一个句子和一个单词列表。我们必须找到第一个包含单词列表中所有单词的最短子段。

例如:

  

句子 - 这是我遇到过的最好的问题

单词列表 -

  

     

最好

     

答案应该是:

  

这是最好的

如果有很多这样的子片段,那么我们必须打印包含最少数量单词的片段并在句子中首先出现。

2 个答案:

答案 0 :(得分:4)

这是我解决上述问题的方法。

<强> 1 即可。取2个指针,头部和尾部都指向0

现在移动头指针,直到头指针指向的单词是有效关键字;现在标记为头。

<强> 2 即可。现在移动尾指针,直到句子包含所有给定的关键字至少一次;现在标记为尾巴。

这是第一个包含所有有效关键字的有效子段,并计算它的长度

第3 即可。现在检查头部的单词频率 - 如果它大于1,现在将头指针移动到句子中的一个单词,这是一个有效的关键字,并且它包含单词的频率为1。

<强> 4 即可。现在检查是否存在所有关键字 - 如果是,则计算它的长度并将其存储为最小子段。

<强> 5 即可。如果它不包含所有有效关键字,现在移动尾指针直到找到所有关键字并计算其长度,如(tail-head + 1);如果它大于最小值,则忽略它。

<强> 6 即可。现在继续此过程直到给定句子的最后一个关键字

上述方法的复杂性是o(n)。

例如,让我们来看看

Hi this is a funny world this is a good experience with this world

我需要找到3个关键字

this
is
world

首先考虑所需的2个哈希表,获得 现在将所有必需的关键字存储在所需的表

现在把头和尾取为0现在检查hi是一个有效的关键字,因为它不会移动头

现在检查下一个关键字,即这个,现在这是一个有效的关键字,所以将数量计为1并将此单词位置存储为head。所以现在head为1

现在移动尾指针,所以下一个关键字是&#34;是&#34; ,它是一个有效的增量计数 现在同样检查一个有趣的关键字,因为它们不是有效的,因此移动到世界

现在世界是有效的,数量是3,尾数是4,只要count ==没有必需的关键字(在我们的例子中是3),这意味着我们的段包含所有有效的关键字

现在它的长度是(4-1 + 1)= 4

现在检查单词的频率它是一个因此,如果我们移动这个头指针然后我们不会得到一个有效的段

所以现在将尾指针移动到下一个字,现在将此频率从1更新为2,计数器变为4

所以现在我们可以移动我们的头指针现在移动到一个关键字现在更新计数器为3因为我们的段目前不会包含这个因为我们已经从这个关键字转移了头指针

现在再次计数为3因此再次计算它的长度为4

所以检查head关键字的频率是1是因此将尾指针移动到下一个关键字现在是关键字freq大于1因此现在移动头指针直到我们得到一个有效的关键字,freq为1现在获得关键字是世界,头部位置是5,尾部位置是7 和计数器是3所以计算长度为7-5 + 1,这是3因此这是我们发现到目前为止的最小长度

现在移动尾部,直到头部的关键字频率超过1,最后我们的尾巴变为13

现在将头部从5移动到6来计算它的长度,它变成13-6 + 1即8,所以忽略它

现在我们无法移动我们的尾巴因此将min_head中的单词打印为min_tail作为最终结果

在我们的案例中,答案是

这是世界

答案 1 :(得分:1)

考虑以下简单方法 -

为句子中的每个单词进行字典映射(枚举)。喜欢 -

  

这[1]是[2] [3]最好的[4]问题[5]我[6]有[7]曾[8]解决了[9]

假设句子中的所有单词都是不同的。

现在,一次只取一个字,并保持该字的最大值和最小值的记录为关键字。在这种情况下,它将分别为4和1。 返回限制范围内的字符串。