单词搜索 II
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019082921452940.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW9ob3V0YW8=,size_16,color_FFFFFF,t_70)
class Solution {
public:
struct Node
{
int val;
Node* child[26];
bool isWord = false;
Node()
{
for (int i = 0; i < 26; ++i)
child[i] = NULL;
}
};
Node* root=new Node();
vector<string> result;
void insert_tree(vector<string>& words)
{
int len = words.size();
for (int i = 0; i < len; ++i)
{
//选择第一个words进行
string word = words[i];
//现在开始字典树的插入过程
int len_w = word.size();
Node* node = root;
for (int j = 0; j < len_w; ++j)
{
char c = word[j];
if (node->child[c - 'a'] == NULL)//如果为空的话,就需要新建
{
node->child[c - 'a'] = new Node();
}
node = node->child[c - 'a'];//继续向下遍历,如果有继续,如果没有新建节点
}
node->isWord = true;//当前节点是单词的末尾
}
}
bool trie_word(string word)
{
Node* temp = root;
for (int i = 0; i < word.size(); ++i)
{
if (temp->child[word[i] - 'a'] == NULL)
return false;
temp = temp->child[word[i] - 'a'];
}
return temp->isWord;
}
bool trie_tree(string word)//查找是否是其中的节点
{
int len = word.size();
Node* node = root;
for (int i = 0; i < len; ++i)
{
char c = word[i];
if (node->child[c - 'a'] != NULL)
{
node = node->child[c - 'a'];
}
else
return false;
}
if (node->isWord == true)
return true;
else
return false;
}
bool trie_c(string s)//查找其中的部分是否是树中的一部分
{
Node* temp = root;
for (int i = 0; i < s.size(); ++i)
{
if (temp->child[s[i] - 'a'] == NULL)
{
return false;
}
temp = temp->child[s[i] - 'a'];
}
return true;
}
void DFS(vector<vector<char>>& board, vector<vector<int>>& visit, int i, int j, string& word)
{
int len_w = word.size();
int col = board.size();
int row = board[0].size();
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
if (trie_word(word))
{
result.push_back(word);
}
for (int k = 0; k < 4; ++k)
{
int nx = i + dx[k];
int ny = j + dy[k];
if (nx < 0 || nx >= col || ny < 0 || ny >= row)
continue;
if (visit[nx][ny] == 0&& trie_c(word))
{
visit[nx][ny] = 1;
word = word + board[nx][ny];
DFS(board, visit, nx, ny, word);
word = word.substr(0, word.size() - 1);
visit[nx][ny] = 0;
}
}
}
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
//直接使用DFS进行计算结合前缀树
int len = words.size();
int col = board.size();
int row = board[0].size();
set<string> www;
vector<string> words1;
for (int i = 0; i < words.size(); ++i)
www.insert(words[i]);
for (auto it = www.begin(); it != www.end(); ++it)
words1.push_back(*it);
words = words1;
//首先构建字典树
insert_tree(words);
for (int i = 0; i<col; ++i)
{
for (int j = 0; j<row; ++j)
{
vector<vector<int>> visit(col, vector<int>(row, 0));//局部性
//if (trie_c(word[0], node))//如果满足条件进入DFS
string word;
word = word + board[i][j];
visit[i][j] = 1;
DFS(board, visit, i, j, word);
visit[i][j] = 0;
}
}
set<string> linshi;
for (int i = 0; i < result.size(); ++i)
{
linshi.insert(result[i]);
}
result.clear();
for (auto it = linshi.begin(); it != linshi.end(); ++it)
result.push_back(*it);
return result;
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190829214621282.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW9ob3V0YW8=,size_16,color_FFFFFF,t_70)