struct TrieNode
{
bool isEnd;
TrieNode *next[26];
TrieNode()
{
isEnd = false;
memset(next, 0, sizeof(next));
}
};
class Dict
{
private:
TrieNode *root;
public:
Dict()
{
root = new TrieNode();
}
void insert(string word) {
TrieNode *node = root;
for(int i = 0; i < word.size(); i++)
{
char ch = word[i];
if(node->next[ch - 'a'] == NULL)
{
node->next[ch - 'a'] = new TrieNode();
}
node = node->next[ch - 'a'];
}
node->isEnd = true; //如果单词现在是 app,则node现在指向第4层的结点(root为第1层)
}
void replaceUtil(vector<string>&str)
{
string res = "";
TrieNode *node = root;
for(int i = 0; i < str.size(); i++)
{
res = "";
node = root;
for(int j = 0; j < str[i].size(); j++)
{
char ch = str[i][j];
if(node->next[ch - 'a'] != NULL)
{
res += ch;
node = node->next[ch - 'a'];
if(node->isEnd == true)
{//找到一个词根(最短的)
str[i] = res; //找到了才改,断了不改
break;
}
}
else
{//断了
break;
}
}
}
}
};
class Solution {
public:
string replaceWords(vector<string>& dict, string sentence) {
Dict dicts;
for(int i = 0; i < dict.size(); i++)
{//建字典树
dicts.insert(dict[i]);
}
vector<string>str;
for(int i = 0; i < sentence.size(); i++)
{//分隔单词
if(sentence[i] == ' ') continue;
string temp = "";
while(i < sentence.size() && sentence[i] != ' ')
{
temp += sentence[i++];
}
str.push_back(temp);
}
dicts.replaceUtil(str);//用词根替换
string res;//连成句子
for(int i = 0; i < str.size(); i++)
{
res += str[i] + " ";
}
res.pop_back(); //去掉最后一个空格
return res;
}
};