您的位置:首页 > 其它

LeetCode Word Search II DFS+Trie树

2015-11-06 13:04 274 查看
思路:

参考DISCUSS,使用Trie树加快dfs的搜索速度。

java code:

public class Solution {

//construct a Trie to speed up search process
class TrieNode {
// Initialize your data structure here.
public boolean isWord = false;
public TrieNode[] children = new TrieNode[26];
public TrieNode() {

}
}
public class Trie {
private TrieNode root;

public Trie() {
root = new TrieNode();
}

// Inserts a word into the trie.
public void insert(String word) {
TrieNode cur = root;
for(int i = 0; i < word.length(); ++i) {
char c = word.charAt(i);
if(cur.children[c - 'a'] == null) {
cur.children[c - 'a'] = new TrieNode();
}
cur = cur.children[c - 'a'];
}
cur.isWord = true;
}

// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode cur = root;
for(int i = 0; i < word.length(); ++i) {
char c = word.charAt(i);
if(cur.children[c - 'a'] == null) return false;
cur = cur.children[c - 'a'];
}
return cur.isWord;
}

// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode cur = root;
for(int i = 0; i < prefix.length(); ++i) {
char c = prefix.charAt(i);
if(cur.children[c - 'a'] == null) return false;
cur = cur.children[c - 'a'];
}
return true;
}
}

Set<String> res = new HashSet<String>();
public List<String> findWords(char[][] board, String[] words) {
//construct a Trie
Trie trie = new Trie();
//init Tire
for(int i = 0; i < words.length; ++i) {
trie.insert(words[i]);
}
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m]
;
//start search from every character
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
dfs(board, visited, "", i, j, trie);
}
}
return new ArrayList<String>(res);
}

public void dfs(char[][] board, boolean[][] visited, String curStr, int i, int j, Trie trie) {
if(i < 0 || i >= board.length || j < 0 || j >= board[0].length) return;
if(visited[i][j] == true) return;

curStr += board[i][j];
//if Trie doestn't have curStr, it must not have the word which start with curStr, so pass
if(!trie.startsWith(curStr)) return;
if(trie.search(curStr)) {
res.add(curStr);
}

visited[i][j] = true;
dfs(board, visited, curStr, i + 1, j, trie);
dfs(board, visited, curStr, i - 1, j, trie);
dfs(board, visited, curStr, i, j + 1, trie);
dfs(board, visited, curStr, i, j - 1, trie);
visited[i][j] = false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: