使用深度优先搜索进行单词搜索

时间:2015-11-02 06:27:18

标签: java depth-first-search wordsearch

我正在研究一个单词搜索问题。我正确地实现了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'。

1 个答案:

答案 0 :(得分: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;