在二进制数字数组中查找最长的一系列

时间:2011-12-01 11:22:44

标签: java regex algorithm

如何找到这个二进制数字数组中最长的一系列 - 100011101100111110011100

在这种情况下,答案应为= 11111

我正在考虑循环遍历数组并检查每个数字,如果数字为1,则将其添加到新的String中,如果它为零,则重新开始创建新的String但保存先前创建的String。完成后检查每个String的长度,看哪个是最长的。我确定有一个更简单的解决方案吗?

4 个答案:

答案 0 :(得分:4)

你的算法很好,但你不需要保存所有临时字符串 - 它们都是"那些"反正。

你应该只有两个变量" bestStartPosition"和#34; bestLength"。找到一系列"" - 您将此序列的长度与保存的" bestLength"进行比较,并用新的位置和长度覆盖这两个变量。

扫描完所有数组后 - 您将获得最长序列的位置(如果需要)和长度(通过该长度可以生成一串"那些")。

答案 1 :(得分:3)

这是一些应该做你想做的伪代码:

count = 0
longestCount = 0
foreach digit in binaryDigitArray:
   if (digit == 1) count++
   else:
      longestCount = max(count, maxCount)
      count = 0
longestCount = max(count, maxCount)

更容易提取1的所有序列,按长度排序并选择第一个。但是,根据使用的语言,它可能只是我建议的简短版本。

答案 2 :(得分:3)

具有O(n)时间复杂度的

Java 8更新(并且只有1行):

int maxLength = Arrays.stream(bitStr.split("0+"))
  .mapToInt(String::length)
  .max().orElse(0);

请参阅live demo

这也会自动处理空白输入,在这种情况下返回0


Java 7 紧凑型解决方案,但O(n log n)时间复杂度:

让java API只需3行即可完成所有工作:

String bits = "100011101100111110011100";

LinkedList<String> list = new LinkedList<String>(Arrays.asList(bits.split("0+")));
Collections.sort(list);
int maxLength = list.getLast().length(); // 5 for the example given

这是如何运作的:

  1. bits.split("0+")将输入分解为String[],每个连续的1个链(由全零分隔 - 正则表达式为0+)成为数组的元素
  2. Arrays.asList()String[]变为List<String>
  3. 从刚创建的列表中创建并填充新的LinkedList
  4. 使用集合对列表进行排序。最长的1连锁将排在最后
  5. 获取列表中最后一个元素(最长)的长度。这就是选择LinkedList的原因 - 它有一个getLast()方法,我觉得这很方便
  6. 对于那些认为“太重”的人来说,在我的MacBook Pro上执行样本输入时花了不到1毫秒。除非您的输入字符串长度为千兆字节,否则此代码将很快执行。

    EDITED

    Max建议,使用Arrays.sort()非常相似并且执行时间只有一半,但仍需要3行:

    String[] split = bits.split("0+");
    Arrays.sort(split);
    int maxLength = split[split.length - 1].length();
    

答案 3 :(得分:0)

只有php的预览代码,也许你可以用你的语言重写。

这将说明1的最大长度:

$match = preg_split("/0+/", "100011101100111110011100", -1, PREG_SPLIT_NO_EMPTY);
echo max(array_map('strlen', $match));

结果:

 5