Leetcode 425 Solution
This article provides solution to leetcode question 425 (word-squares)
Access this page by simply typing in "lcs 425" in your browser address bar if you have bunnylol configured.
Leetcode Question Link
https://leetcode.com/problems/word-squares
Solution
class TrieNode
{
public:
vector<TrieNode*> children;
vector<int> indexes;
TrieNode() : children(26, nullptr) {}
};
class Solution {
public:
TrieNode* build(vector<string>& words)
{
TrieNode* root = new TrieNode();
for (int i = 0; i < words.size(); i++)
{
auto word = words[i];
auto p = root;
for (auto ch : word)
{
if (p->children[ch - 'a'] == nullptr)
p->children[ch - 'a'] = new TrieNode();
p = p->children[ch - 'a'];
p->indexes.push_back(i);
}
}
return root;
}
void search(vector<string>& words, vector<vector<string>>& res, vector<string>& curr, int level, TrieNode* root)
{
if (level >= curr[0].size())
{
res.push_back(curr);
return;
}
string pre;
for (int i = 0; i < level; i++)
pre += curr[i][level];
auto p = root;
for (auto ch : pre)
{
if (p->children[ch - 'a'] == nullptr)
return;
p = p->children[ch - 'a'];
}
for (auto index : p->indexes)
{
curr.push_back(words[index]);
search(words, res, curr, level + 1, root);
curr.pop_back();
}
}
vector<vector<string>> wordSquares(vector<string>& words) {
TrieNode* root = build(words);
vector<vector<string>> res;
for (auto word : words)
{
vector<string> square;
square.push_back(word);
search(words, res, square, 1, root);
}
return res;
}
};