| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | 
							- import java.util.LinkedList;
 
- class Solution {
 
-     private int[] dy = new int[]{0, 1, 0, -1};
 
-     private int[] dx = new int[]{1, 0, -1, 0};
 
-     private char[][] board;
 
-     private int n;
 
-     private int m;
 
-     private TrieNode root;
 
-     public List<String> findWords(char[][] board, String[] words) {
 
-         LinkedList<String> res = new LinkedList<>();
 
-         if ((n = board.length) == 0 || (m = board[0].length) == 0 || words.length == 0) return res;
 
-         this.board = board;
 
-         root = new TrieNode();
 
-         for (String word : words) root.insert(word);
 
-         for (int y = 0; y < n; y++)
 
-             for (int x = 0; x < m; x++)
 
-                 backtracking(y, x, root, res);
 
-         return res;
 
-     }
 
-     private void backtracking(int y, int x, TrieNode curr, LinkedList<String> res) {
 
-         if (curr == null) return;
 
-         if (curr.word != null) {
 
-             res.add(curr.word);
 
-             curr.word = null;
 
-         }
 
-         char c;
 
-         if (y < 0 || n <= y || x < 0 || m <= x || (c = board[y][x]) == '#') return;
 
-         board[y][x] = '#';
 
-         curr = curr.next[c - 'a'];
 
-         for (int i = 0; i < 4; i++) backtracking(y + dy[i], x + dx[i], curr, res);
 
-         board[y][x] = c;
 
-     }
 
-     class TrieNode {
 
-         String word;
 
-         TrieNode[] next = new TrieNode[26];
 
-         void insert(String str) {
 
-             TrieNode curr = this;
 
-             for (char c : str.toCharArray()) {
 
-                 int i = c - 'a';
 
-                 if (curr.next[i] == null) curr.next[i] = new TrieNode();
 
-                 curr = curr.next[i];
 
-             }
 
-             curr.word = str;
 
-         }
 
-     }
 
- }
 
 
  |