实现一个二维数组包含另一个数组的好方法是什么?
例如:
A = [0, 0, 0]
[1, 1, 2]
[0, 3, 4]
B = [1, 2]
[3, 4]
C = [0, 0, 0]
[1, 1, 2]
D = [1, 1, 2]
[9, 3, 4]
contains(A, B) // true
contanis(A, C) // true
contains(A, D) // false
我试过这样做。基本上,它只是遍历A直到A [row] [col] == B [0] [0],如果找到一个,那么将A与来自[row] [col]的B进行比较。
public static boolean contains(int[][] a, int[][] b) {
// search for matching first element
// only want to search up to a-b size
for(int ra = 0; ra <= a.length - b.length; ra++) {
for(int ca = 0; ca <= a[0].length - b[0].length; ca++) {
// found matching first element
if(a[ra][ca] == b[0][0]) {
boolean tempFound = true;
// check matching array from starting element
for(int rb = 0; rb < b.length; rb++) {
for(int cb = 0; cb < b[0].length; cb++) {
if(b[rb][cb] != a[ra + rb][ca + cb]) {
tempFound = false;
break;
}
}
if(!tempFound) break;
}
// found it
if(tempFound) return true;
// otherwise keep trying to find first matching element
}
}
}
return false;
}
但对于看似可以用更简单的方式完成的事情来说,这似乎令人难以置信的复杂和野蛮。有没有更好的方法呢?
答案 0 :(得分:0)
在最基本的术语中......你实际上是在执行子字符串搜索,除了你有整数而不是字符而你没有按顺序寻址数组。因此,将此问题减少为子字符串搜索算法。
使用略微改变的Boyer-Moore搜索算法,您将获得更好的性能。将其视为2-D Boyer Moore搜索算法。