在这个问题上,我们得到了字典和单词。我们的任务是检查是否可以使用两个字典单词的串联来形成给定的后缀。
虽然形成给定的单词,单词的重复是不合法的。
让我们举个例子来了解这个问题,
dictionary = {“hello”, “tutorials”, “program” , “problem”, “coding”, “point”} word = “nhooo”输出结果
yes
nhooo is created using tutorials and point.
为了解决这个问题,我们将字典的所有元素存储在通常称为trie的前缀树中。然后在trie中搜索单词的前缀(如果找到),将其分成两个部分并搜索单词的其他部分。如果找到,则返回true,否则返回false。
展示解决方案实施情况的程序,
#include<bits/stdc++.h>
using namespace std;
#define char_int(c) ((int)c - (int)'a')
#define SIZE (26)
struct TrieNode{
TrieNode *children[26];
bool isLeaf;
};
TrieNode *getNode(){
TrieNode * newNode = new TrieNode;
newNode->isLeaf = false;
for (int i =0 ; i< 26 ; i++)
newNode->children[i] = NULL;
return newNode;
}
void insert(TrieNode *root, string Key){
int n = Key.length();
TrieNode * pCrawl = root;
for (int i=0; i<n; i++){
int index = char_int(Key[i]);
if (pCrawl->children[index] == NULL)
pCrawl->children[index] = getNode();
pCrawl = pCrawl->children[index];
}
pCrawl->isLeaf = true;
}
int prefixSearch(struct TrieNode *root, string key){
int pos = -1, level;
struct TrieNode *pCrawl = root;
for (level = 0; level < key.length(); level++){
int index = char_int(key[level]);
if (pCrawl->isLeaf == true)
pos = level;
if (!pCrawl->children[index])
return pos;
pCrawl = pCrawl->children[index];
}
if (pCrawl != NULL && pCrawl->isLeaf)
return level;
}
bool isWordCreated(struct TrieNode* root, string word){
int len = prefixSearch(root, word);
if (len == -1)
return false;
string split_word(word, len, word.length()-(len));
int split_len = prefixSearch(root, split_word);
return (len + split_len == word.length());
}
int main() {
vector<string> dictionary = {"tutorials", "program", "solving", "point"};
string word = "nhooo";
TrieNode *root = getNode();
for (int i=0; i<dictionary.size(); i++)
insert(root, dictionary[i]);
cout<<"Word formation using dictionary is ";
isWordCreated(root, word)?cout<<"possible" : cout<<"not possible";
return 0;
}输出结果
Word formation using dictionary is possible