2015-11-02 91 views
3

我工作的一個詞搜索問題。我正確實施了dfs搜索,但其他地方存在trival錯誤。單詞搜索使用深度優先搜索

對於此列表中字[「誓言」,「豌豆」,「吃」,「雨」],「誓言」和「吃」可以在主板上找到:

[ 
['o','a','a','n'], 
['e','t','a','e'], 
['i','h','k','r'], 
['i','f','l','v'] 
        ] 

我設計了一個程序來搜索給定董事會中的所有單詞。這裏是我的代碼使用dfs:

public class WordSearchII { 
public List<String> findWords(char[][] board, String[] words) { 

    List<String> res = new ArrayList<String>(); 

    // in order to reinitailize the board every time after 
    //I search each word in the board 
    char[][] temp = new char[board.length][board[0].length]; 
    for (int i=0; i<board.length; i++){ 
      for(int j=0; j<board[i].length; j++){ 
       temp[i][j]=board[i][j]; 
      } 
     } 

    for (String word : words){ 
     board=temp; //reintialize the board 
     for (int i=0; i<board.length; i++){ 
      for(int j=0; j<board[i].length; j++){ 
       if (find_word(board, word, i, j, 0))// bfs search 
       res.add(word); 
      } 
     } 
    } 
    return res; 
} 

public boolean find_word(char[][] board, String word, int i, int j, int index){ 

    if (index==word.length()) return true; 

    if (i<0 || i>=board.length || j<0 || j>=board[i].length) return false; 

    if (board[i][j]!=word.charAt(index)) return false; 

    char temp=board[i][j]; 

    board[i][j] = '*'; 

    if (find_word(board, word, i-1, j, index++)|| 
     find_word(board, word, i+1, j, index++)|| 
     find_word(board, word, i, j-1, index++)|| 
     find_word(board, word, i, j+1, index++)) return true; 

    board[i][j]= temp; 

    return false; 

} 
} 

對於上面給出的示例,我的代碼奇怪地返回[eat,eat]。

由於我遍歷單詞列表並判斷它們是否可以在董事會中找到。儘管我沒有找到'誓言',但'吃'不應該在結果列表中添加兩次。

回答

2

這似乎是這個問題:

if (find_word(board, word, i-1, j, index++)|| 
    find_word(board, word, i+1, j, index++)|| 
    find_word(board, word, i, j-1, index++)|| 
    find_word(board, word, i, j+1, index++)) return true; 

你每次遞增索引,但你已經通過index + 1每一個子電話。

if (find_word(board, word, i-1, j, index+1)|| 
    find_word(board, word, i+1, j, index+1)|| 
    find_word(board, word, i, j-1, index+1)|| 
    find_word(board, word, i, j+1, index+1)) return true;