【题目】
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
【代码】
class Solution {
public:
int dir[4][4]={{-1,0},{1,0},{0,-1},{0,1}};//位置坐标
bool dfs(int x,int y,int index,vector<vector<char>>& board,string &word,vector<vector<bool>>& visited)
{
if(index==word.size()-1)
return word[index]==board[x][y];
if(word[index]==board[x][y])
{
visited[x][y]=true;
for(int i=0;i<4;i++)
{
int new_x=x+dir[i][0];
int new_y=y+dir[i][1];
if(new_x>=0&&new_x<board.size()&&new_y>=0&&new_y<board[0].size()&&!visited[new_x][new_y])
{
if(dfs(new_x,new_y,index+1,board,word,visited))
return true;
}
}
visited[x][y]=false;
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
int m=board.size();//行数
int n=board[0].size();//列数
vector<vector<bool>> visited(m,vector<bool>(n));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(dfs(i,j,0,board,word,visited))
return true;
}
return false;
}
};
【题目】
给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。
示例:
输入:
words = [“oath”,“pea”,“eat”,“rain”] and board =
[
[‘o’,‘a’,‘a’,‘n’],
[‘e’,‘t’,‘a’,‘e’],
[‘i’,‘h’,‘k’,‘r’],
[‘i’,‘f’,‘l’,‘v’]
]
输出: [“eat”,“oath”]
【思路】
在|版本上增加代码代码,如下:
vector<string> findWords(vector<vector<char>>& board, vector<string>& words)
{
vector<string>res;
for(int i=0;i<words.size();i++)
{
if(exist(board,words[i]))
res.insert(res.begin(),words[i]);
}
return res;
}
结果正确但是超时。
需要解决问题:
【改进】
前缀树,代码摘自一个大佬,做了相关注释
【代码】
class TrieNode{
public:
string word = "";
vector<TrieNode*> nodes;
TrieNode():nodes(26, 0){}
};
class Solution {
int rows, cols;
vector<string> res;
public:
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
rows = board.size();
cols = rows ? board[0].size():0;
if(rows==0 || cols==0) return res;
//建立字典树的模板
TrieNode* root = new TrieNode();
for(string word:words){
TrieNode *cur = root;
for(int i=0; i<word.size(); ++i){
int idx = word[i]-'a';
if(cur->nodes[idx]==0) cur->nodes[idx] = new TrieNode();
cur = cur->nodes[idx];
}
cur->word = word;
}
//DFS模板
for(int i=0; i<rows; ++i){
for(int j=0; j<cols; ++j){
dfs(board, root, i, j);
}
}
return res;
}
void dfs(vector<vector<char>>& board, TrieNode* root, int x, int y){
char c = board[x][y];
//递归边界
if(c=='.' || root->nodes[c-'a']==0) return;
root = root->nodes[c-'a'];
if(root->word!=""){
res.insert(res.begin(),root->word);
root->word = "";
}
board[x][y] = '.';
if(x>0) dfs(board, root, x-1, y);
if(y>0) dfs(board, root, x, y-1);
if(x+1<rows) dfs(board, root, x+1, y);
if(y+1<cols) dfs(board, root, x, y+1);
board[x][y] = c;
}
};