在二维“干草堆”中寻找“针”

时间:2012-03-01 10:00:50

标签: string algorithm search

我想这是最常见的面试问题之一,但我无法以有效的方式解决它(有效意味着时间复杂度较低,使用合适的数据结构)。 问题是这样的: 如果有m x n matrix个字符(比如haystack)和给定的char长度为k的字符串(针)。编写一个程序来检查大海捞针是否包含针头。请注意,我们只需要从上到下或从左到右搜索干草堆。 例如

Haystack

ahydsfd
sdflddl
dfdfd
dfdl
uifddffdhc

Needle:
hdffi

Output:
Yes Found!!

3 个答案:

答案 0 :(得分:8)

天真的暴力是O(m * n * k)。以下是一些优化建议。

单一搜索
不是同时搜索水平线而是另一个垂直线,而是同时进行。每当您发现针的第一个字母出现时,请查找从该字母开始的水平和垂直匹配。这不会提高复杂性,但在很多情况下,这可能会缩短时间,因为你只会看一次糟糕的开始。

稀有信件
不要寻找针的第一个字母,而是寻找针中出现的最稀有的字母。这将排除很多可能的匹配。要确定哪些字母最稀有,要么扫描整个电路板,要么使用随机采样。

高效字符串搜索
使用更好的string searching algorithm,例如Knuth–Morris–Pratt。使用算法分别搜索每一行和每列。我敢打赌,这就是采访者所追求的,因为它将复杂性降低到了O(m * n)。

利用短行
我注意到并非所有行都具有相同的长度。当你寻找垂直匹配时,你可以在针头“弹出”袋子后立即停止搜索该行,因为沿着该行的所有针头也会从口袋中退出,因此无法匹配。

答案 1 :(得分:0)

蛮力方法的时间复杂度最差为m * n。即如果针是单个字符,我们就开始逐行或逐列解析矩阵。

答案 2 :(得分:0)

您可以将第一个字符的搜索限制为n-k列和m-k行。一旦找到,2(k-1)将需要比较答案。