Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用哈希查找总长度最小的字符串子数组,该子数组包含原始数组中的所有不同字符串_Java_Arrays_String_Algorithm_Hash - Fatal编程技术网

Java 使用哈希查找总长度最小的字符串子数组,该子数组包含原始数组中的所有不同字符串

Java 使用哈希查找总长度最小的字符串子数组,该子数组包含原始数组中的所有不同字符串,java,arrays,string,algorithm,hash,Java,Arrays,String,Algorithm,Hash,您好,这是一个关于散列的java练习。首先,我们有一个由N个字符串(1)组成的数组 遍历数组一次,使用散列来跟踪您以前是否看到过一个单词。仅当您第一次看到一个单词时,通过将计数相加来计算数组中的不同单词 第二次遍历数组,使用散列记录每个单词的显示次数。同时记录所显示的所有单词的长度总和。继续,直到至少看到一次所有单词为止 现在,在不将单词计数减少到零的情况下,尽可能向前移动范围的开头。请记住相应地调整哈希和字母计数。这将为您提供第一个范围,其中每个单词至少包含一次,如果不排除一个单词,则不能减少

您好,这是一个关于散列的java练习。首先,我们有一个由N个字符串(1)组成的数组
  • 遍历数组一次,使用散列来跟踪您以前是否看到过一个单词。仅当您第一次看到一个单词时,通过将计数相加来计算数组中的不同单词

  • 第二次遍历数组,使用散列记录每个单词的显示次数。同时记录所显示的所有单词的长度总和。继续,直到至少看到一次所有单词为止

  • 现在,在不将单词计数减少到零的情况下,尽可能向前移动范围的开头。请记住相应地调整哈希和字母计数。这将为您提供第一个范围,其中每个单词至少包含一次,如果不排除一个单词,则不能减少范围

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

  • 在执行步骤3和4时,请跟踪到目前为止的最小长度以及关联范围的起点和终点。当需要将范围的右端移过阵列的终点时,即可完成此操作。此时,您拥有正确的最小长度,以及达到该长度的范围


    这是以线性时间运行的。

    欢迎使用Stackoverflow!对于一些算法爱好者来说,这可能是一个有趣的问题,但我认为目前形式的问题有点难以理解,他们可能会错过这个机会。当你说“连续子数组可以是…”时,你是否错过了{apple,orange,orange,pear}?您还可以明确定义最小长度(每个数组元素的长度之和)的含义。@FooF从答案19来看,最小长度似乎是序列中的字符总数。您的问题可以理解为“原始数组中有多少不同的字符串?”因为不需要AFAIC,所述子阵列必须实际出现在原始阵列中,只要存在这样的子阵列。@尝试操作需要最小的字母数。而且我认为算法描述比代码更有用。@DaveGalvin非常感谢!我终于通过了所有测试用例。但我意识到对于第3步和第4步,我不仅要从左到右检查,还需要从右到左检查(反转数组并再次检查)才能得到答案。@user2982578您能举一个例子,说明需要反转才能抓住一个案例吗?