我的工作是为其他学生测试练习。今天我遇到了一个非常困难的人(至少对我而言),我不确定我现在是不是一个傻瓜。
我有一个2D char数组和3个字符串,我必须在那里找到。单词可以跨越水平,垂直和对角线;前进或后退。问题:我不允许使用任何方法,一切都必须在main方法中。
我找不到一种不喜欢的方式< 10个循环。你有一个聪明的主意吗?
答案 0 :(得分:0)
我的意思是,这是显而易见的方式,当然......
使用Boyer-Moore或类似内容可以略微加快比较。
for row in haystack:
for character in row:
#check if pattern or reversed pattern matches
for column in haystack:
for character in column:
#check if pattern or reversed pattern matches
for positively-sloped-diagonal in haystack:
for character in diagonal:
#check
for negatively-sloped-diagonal in haystack:
for character in diagonal:
#check
根据确切的参数,做一些像这样的事情可能会少一点:
for each pattern:
for each slot in the array:
for horizontal in [-1, 0, 1]:
for vertical in [-1, 0, 1]:
if horizontal == vertical == 0:
pass
for n in range(pattern.length):
if pattern[n] != haystack[row + n * vertical][column + n * horizontal]
break
#Pattern found
#Pattern not found
答案 1 :(得分:0)
您可以递归调用main方法来搜索向前,向后,向上,向下,向左/向下对角线和向右/向上对角线。
if (arg[2] == array.length && arg[3] == array.length)
return 0;
if (firstTimeMainFunctionCalled) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
// Only make recursive call when you are
// on the outer edge of the 2D array
if (i == 0 || j == 0) {
main(1, 0, i, j);
main(0, 1, i, j);
main(1, 1, i, j);
main(-1, 0, i, j);
main(0, -1, i, j);
main(-1, -1, i, j);
main(1, -1, i, j);
main(-1, 1, i, j);
}
}
}
int rowInc = arg[0];
int colInc = arg[1];
int curRow = arg[2];
int curCol = arg[3];
int str1Place = 0;
int str2Place = 0;
int str3Place = 0;
while (curRow >= 0 && curCol >= 0 && curRow < array.length && curCol < array[0].length) {
if (array[curRow][curCol] == str1[str1Place])
str1Place++;
else
str1Place = 0;
if (str1Place == str1.length)
// Found str1
// Do the same for str2 and str3
curRow += rowInc;
curCol += colInc;
}
这是一个非常粗略的解决方案并且可以进行很多改进,显然你必须通过将参数转换为字符串列表来适当地调用main方法,但它应该给你一个开始的地方。您可以使用动态编程来改善这一点,您也可以在找到它后回溯到字符串。另外,正如您所看到的,嵌套循环不需要嵌套。
请原谅我的伪代码:)