字典树--字典树题母
原创
©著作权归作者所有:来自51CTO博客作者wx596330ff6d68f的原创作品,请联系作者获取转载授权,否则将追究法律责任
648. Replace Words
Medium
457110FavoriteShare
In English, we have a concept called root
, which can be followed by some other words to form another longer word - let's call this word successor
. For example, the root an
, followed by other
, which can form another word another
.
Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor
in the sentence with the root
forming it. If a successor
has many roots
can form it, replace it with the root with the shortest length.
You need to output the sentence after the replacement.
Example 1:
Input: dict = ["cat", "bat", "rat"]
sentence = "the cattle was rattled by the battery"
Output: "the cat was rat by the bat"
typedef struct Trie_node{
bool exist;
struct Trie_node* next[26];
Trie_node():exist(false){
memset(next,0,sizeof(Trie_node*) * 26);
}
}TrieNode,*Trie;
class Solution {
public:
string replaceWords(vector<string>& dict, string sentence) {
string Result;
if(sentence.length() == 0){
return Result;
}
Trie root = new TrieNode();
BuildTrieTree(root,dict);
stringstream ss(sentence);
string temp;
ss >> temp;
Result += FindStr(root,temp);
while(ss >> temp){
Result = Result + " " + FindStr(root,temp);
}
return Result;
}
void BuildTrieTree(Trie root,vector<string>& dicts){
for(auto dict : dicts){
Trie p = root;
for(int i = 0;i < dict.length();i ++){
int index = dict[i] - 'a';
if(p->next[index] == NULL){
p->next[index] = new Trie_node();
}
p = p->next[index];
if(i == dict.length() - 1){
p->exist = true;
}
}
}
}
string FindStr(Trie root,const string& str){
Trie p = root;
for(int i = 0;i < str.length();i ++){
int index = str[i] - 'a';
if(p->next[index]){
if(p->next[index]->exist){
return str.substr(0,i + 1);
}
p = p->next[index];
}
else{
return str;
}
}
return str;
}
};