在没有任何方法的情况下搜索2D字符数组中的字符串

时间:2016-10-29 13:19:45

标签: java arrays loops

我的工作是为其他学生测试练习。今天我遇到了一个非常困难的人(至少对我而言),我不确定我现在是不是一个傻瓜。

我有一个2D char数组和3个字符串,我必须在那里找到。单词可以跨越水平,垂直和对角线;前进或后退。问题:我不允许使用任何方法,一切都必须在main方法中。

我找不到一种不喜欢的方式< 10个循环。你有一个聪明的主意吗?

2 个答案:

答案 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方法,但它应该给你一个开始的地方。您可以使用动态编程来改善这一点,您也可以在找到它后回溯到字符串。另外,正如您所看到的,嵌套循环不需要嵌套。

请原谅我的伪代码:)