查找给定字符串中最长空白序列长度的算法

时间:2010-04-11 12:08:12

标签: algorithm

寻找一种算法来查找给定字符串中最长的空白序列的长度,检查尽可能少的字符?

提示:随着空白序列的长度增加,你的程序会变得更快。

我知道解决方案是O(n)..但寻找更优化的解决方案

5 个答案:

答案 0 :(得分:7)

您将无法找到比O(n)更小的复杂度的解决方案,因为您需要在最坏情况下使用最多为0或1个连续空格的输入字符串来传递每个字符,或者完全是空白。

你可以做一些优化,但它仍然被认为是O(n)。

例如:

在您浏览列表时,让M成为当前最长的匹配。还假设您可以访问O(1)中的输入元素,例如,您有一个数组作为输入。

当您看到非空格时,如果current + M是非空格,则可以跳过M个元素。当然,没有比M更长的空白。

当你看到一个whitepsace角色时,如果current + M-1不是空白,你知道你没有最长的跑步o你也可以跳过这种情况。

答案 1 :(得分:6)

但在最坏的情况下(当所有角色都是空白时)你必须检查每个角色。所以它在复杂性方面不能比O(n)更好。

基本原理:假设整个字符串为空,您没有检查N个字符,算法输出n。然后,如果任何未检查的字符不是空白,您的答案将是错误的。因此,对于此特定输入,您必须检查整个字符串。

答案 2 :(得分:2)

在最坏的情况下,没有办法让它比O(N)更快。但是,这里有一些优化,假设基于0的索引。

  1. 如果您已经有一个完整的L空白序列(完整意味着一个序列不是更大序列的子序列),L至少大到一半大小你的字符串,你可以停止。
  2. 如果您有完整的L空白序列,一旦您点击位置i的空格,请检查位置i + L处的字符是否也是空格。如果是,请继续从位置i向前扫描,因为您可能会找到更大的序列 - 但是,如果您遇到位置i + L之前的非空格,则可以直接跳至i + L + 1 。如果它不是空格,则无法从i开始构建更大的序列,因此从i + L + 1开始向前扫描。
  3. 如果您有一个完整的长度为L的空白序列,并且您处于i位置并且还有k个位置需要检查,k <= L,则为可以阻止你的搜索,因为显然你无法再找到更好的东西了。
  4. 要证明您不能使其比O(N)更快,请考虑不包含空格的字符串。您必须访问每个字符一次,因此它是O(N)。与只包含空格的字符串相同。

答案 3 :(得分:1)

显而易见的想法:你可以跳过K + 1个位置(其中K是当前最长的空间序列),如果你找到了空格,则向后扫描。

这样你就可以检查(n + n / M)/ 2 = n(M + 1)/ 2M位置。

编辑:
另一个想法是应用一种二分搜索。这如下所示:对于给定的 k ,您创建一个过程,检查是否存在 length&gt; = k 的空格序列。这可以在O( n / k )步骤中实现。然后,您尝试使用二进制搜索找到最大 k

编辑:
在随后的搜索过程中,您可以利用某些长度 k 的序列已经存在的知识,并从一开始就在 k 处开始跳过。

答案 4 :(得分:0)

无论你做什么,最坏的情况总是o(n) - 如果这些空格位于字符串的最后一部分......(或字符串的最后一个“已检查”部分)。