Java:如何实现从2D数组(单词搜索)中查找单词?

时间:2016-11-25 23:51:11

标签: java arrays algorithm depth-first-search trie

鉴于2D板和字典中的单词列表,我想在板上找到所有单词。

每个单词必须由顺序相邻的单元格的字母构成,其中“相邻”单元格是水平或垂直相邻的单元格。一个单词中不能多次使用相同的字母单元格。

例如,给定words = ["oath","pea","eat","rain"]和board =

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

Return ["eat","oath"].

并且遇到了以下实施:

public List<String> findWords(char[][] board, String[] words) {
    List<String> res = new ArrayList<>();
    TrieNode root = buildTrie(words);
    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board[0].length; j++) {
            dfs (board, i, j, root, res);
        }
    }
    return res;
}

public void dfs(char[][] board, int i, int j, TrieNode p, List<String> res) {
    char c = board[i][j];
    if (c == '#' || p.next[c - 'a'] == null) return;
    p = p.next[c - 'a'];
    if (p.word != null) {   // found one
        res.add(p.word);
        p.word = null;     // de-duplicate
    }

    board[i][j] = '#';
    if (i > 0) dfs(board, i - 1, j ,p, res); 
    if (j > 0) dfs(board, i, j - 1, p, res);
    if (i < board.length - 1) dfs(board, i + 1, j, p, res); 
    if (j < board[0].length - 1) dfs(board, i, j + 1, p, res); 
    board[i][j] = c;
}

public TrieNode buildTrie(String[] words) {
    TrieNode root = new TrieNode();
    for (String w : words) {
        TrieNode p = root;
        for (char c : w.toCharArray()) {
            int i = c - 'a';
            if (p.next[i] == null) p.next[i] = new TrieNode();
            p = p.next[i];
       }
       p.word = w;
    }
    return root;
}

class TrieNode {
    TrieNode[] next = new TrieNode[26];
    String word;
}

buildTrie(String[] words)中,在为特定单词设置trie后,它会p.word = w;。在dfs(...)中,它会检查if (p.word != null)

但是,p.wordnull是怎样的,直到找到单词中最后一个字符,然后p.word不再是null

p.word不依赖于任何索引,它与对象本身直接相关,因此应该可以随时访问,但我只是不明白它是如何null直到这个词的最后一个字符已被找到。

谢谢

1 个答案:

答案 0 :(得分:0)

这是一个样本特里:

enter image description here

考虑上面的trie,在构造trie期间,除了在它结束的节点之外,每个节点默认wordnull

对于exaple,在上面的trie中插入buy时,我们扫描单词buy的每个字符并将其放在每个节点上。当我们到达最后一个字符y时,我们将buy放入该节点的word变量中。这就是为什么您会发现除了结束的节点之外的所有其他节点word等于null的原因。