-
Notifications
You must be signed in to change notification settings - Fork 5
/
LC_212_WordSearchII.cpp
128 lines (108 loc) · 3.29 KB
/
LC_212_WordSearchII.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
https://leetcode.com/problems/word-search-ii/
212. Word Search II
*/
// class Trie{
// struct TrieNode{
// TrieNode* children[26];
// bool isEnd;
// string str;
// };
// public:
// int m, n;
// TrieNode *root;
// Trie() {
// root = new TrieNode();
// }
// void insert(string& word)
// {
// TrieNode* ptr = root;
// int key=0;
// for(char &c: word)
// {
// key = c-'a';
// if(ptr->children[key] == nullptr)
// ptr->children[key] = new TrieNode();
// ptr = ptr->children[key];
// }
// ptr->isEnd = true;
// ptr->str = word;
// }
// void searchDFS(TrieNode* ptr, int i, int j, vector<vector<char>>& board)
// {
// if(i<0 or i>=m or j<0 or j>=n or board[i][j] == '*' ) return;
// ptr = ptr -> children[board[i][j] - 'a'];
// if(ptr == nullptr) return; // word nhi mila
// if(ptr -> isEnd) // word mil gya first time
// {
// Solution::ans.push_back(ptr->str);
// ptr->isEnd = false; // next time same word na insert kr de
// }
// char ch = board[i][j]; // using it like a visited array
// board[i][j] = '*';
// searchDFS(ptr, i-1, j, board); // up
// searchDFS(ptr, i+1, j, board); // down
// searchDFS(ptr, i, j-1, board); // left
// searchDFS(ptr, i, j+1, board); // right
// board[i][j] = ch;
// }// end search
// };
class Solution {
public:
int m, n;
vector<string> ans;
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
m = board.size();
n = board[0].size();
// Trie tr; tr.m = m; tr.n = n;
root = new TrieNode();
for(string &w: words)
insert(w);
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
searchDFS(root, i, j, board);
}
}
return ans;
}//
struct TrieNode{
TrieNode* children[26];
bool isEnd;
string str;
};
TrieNode *root;
void insert(string& word)
{
TrieNode* ptr = root;
int key=0;
for(char &c: word)
{
key = c-'a';
if(ptr->children[key] == nullptr)
ptr->children[key] = new TrieNode();
ptr = ptr->children[key];
}
ptr->isEnd = true;
ptr->str = word;
}
void searchDFS(TrieNode* ptr, int i, int j, vector<vector<char>>& board)
{
if(i<0 or i>=m or j<0 or j>=n or board[i][j] == '*' ) return;
ptr = ptr -> children[board[i][j] - 'a'];
if(ptr == nullptr) return; // word nhi mila
if(ptr -> isEnd) // word mil gya first time
{
Solution::ans.push_back(ptr->str);
ptr->isEnd = false; // next time same word na insert kr de
}
char ch = board[i][j]; // using it like a visited array
board[i][j] = '*';
if(i-1>=0)searchDFS(ptr, i-1, j, board); // up
if(i+1<m)searchDFS(ptr, i+1, j, board); // down
if(j-1>=0)searchDFS(ptr, i, j-1, board); // left
if(j+1<n)searchDFS(ptr, i, j+1, board); // right
board[i][j] = ch;
}// end search
};