寻找一种算法来查找给定字符串中最长的空白序列的长度,检查尽可能少的字符?
提示:随着空白序列的长度增加,你的程序会变得更快。
我知道解决方案是O(n)..但寻找更优化的解决方案
答案 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的索引。
L
空白序列(完整意味着一个序列不是更大序列的子序列),L
至少大到一半大小你的字符串,你可以停止。L
空白序列,一旦您点击位置i
的空格,请检查位置i + L
处的字符是否也是空格。如果是,请继续从位置i
向前扫描,因为您可能会找到更大的序列 - 但是,如果您遇到位置i + L
之前的非空格,则可以直接跳至i + L + 1
。如果它不是空格,则无法从i
开始构建更大的序列,因此从i + L + 1
开始向前扫描。L
的空白序列,并且您处于i
位置并且还有k
个位置需要检查,k <= L
,则为可以阻止你的搜索,因为显然你无法再找到更好的东西了。要证明您不能使其比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) - 如果这些空格位于字符串的最后一部分......(或字符串的最后一个“已检查”部分)。