4

嗨,这是一个关于哈希的 java 练习。首先,我们有一个包含 N 个字符串的数组(1<=N<=100000),程序将找到包含原始数组中存在的所有不同字符串的连续子序列的最小长度。

例如,原始数组是 {apple,orange,orange pear,pear apple,pear}

连续子数组可以是 {orange, pear, pear, apple}

所以答案是 19

我编写了一个代码,它访问数组中的每个元素并创建一个新的哈希表来查找包含所有不同字符串的子数组的长度。一旦N大于1000,它就会变得非常非常慢。所以我希望有一个更快的算法。谢谢!

4

1 回答 1

1
  1. 通过数组一次,使用散列来跟踪您以前是否看过一个单词。仅当您第一次看到一个单词时,才通过添加计数来计算数组中不同的单词。

  2. 第二次通过数组,使用散列来记录你看到每个单词的次数。还要记录你看到的所有单词的长度总和。继续前进,直到您至少看到所有单词一次。

  3. 现在,只要您可以在不将字数减少为零的情况下,将范围的开头向前移动。请记住相应地调整您的哈希和字母计数。这为您提供了第一个范围,其中至少包含每个单词一次,并且在不排除一个单词的情况下无法缩小。

  4. 重复执行以下操作:将范围的左端向前移动 1,然后将右端向前移动,直到找到刚刚从左端启动的单词的另一个实例。每次执行此操作时,您都会获得另一个包含每个单词一次的最小范围。

在执行步骤 3 和 4 时,跟踪到目前为止的最小长度,以及相关范围的开始和结束。当您需要将范围的右端移动到数组的末尾时,您就完成了。在这一点上,你有正确的最小长度,以及达到它的范围。

这在线性时间内运行。

于 2013-11-12T12:48:02.563 回答