212. 单词搜索 II

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
逻辑没有变,只不过多了单词而已,多加一个循环。但是这样慢,trie树更好。
class Solution {
private TrieNode root = new TrieNode();
private List<String> ret = new ArrayList<>();
public List<String> findWords(char[][] board, String[] words) {
// 构建trie结构
buildTrie(words);
for(int i=0;i<board.length;i++) {
for(int j=0;j<board[0].length;j++) {
if(root.children.containsKey(board[i][j])) {
dfs(board,i,j, root);
}
}
}
return ret;
}
private void buildTrie(String[] words) {
for(String str : words) {
TrieNode cur= root;
for(int i=0;i<str.length();i++) {
char c = str.charAt(i);
if(!cur.children.containsKey(c)) {
cur.children.put(c,new TrieNode());
}
cur = cur.children.get(c);
}
cur.word = str;
}
}
private void dfs(char[][] board, int i,int j, TrieNode node) {
if(i<0||i>=board.length || j<0||j>=board[0].length || board[i][j] == '.') {
return;
}
char c = board[i][j];
TrieNode next = node.children.get(c);
if(next == null) {
return;
}
if(next.word !=null) {
ret.add(next.word);
next.word = null;
}
board[i][j] = '.';
dfs(board,i+1,j,next);
dfs(board,i-1,j,next);
dfs(board,i,j+1,next);
dfs(board,i,j-1,next);
board[i][j] = c;
}
}
class TrieNode {
String word;
Map<Character,TrieNode> children = new HashMap<>();
public TrieNode(){}
}
浙公网安备 33010602011771号