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;
}
};