题目
单词替换
在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
你需要输出替换之后的句子。
样例
输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”
解决方法
语言:C++
结构:前缀树
代码
//前缀树
class Tire {
private:
Tire* next[26] = { nullptr };
bool is_ok = false;
public:
Tire() {};
//建立前缀树,插入
void insert(string dic)
{
auto root = this;
for (auto x : dic)
{
if (root->next[x - 'a'] == nullptr)
root->next[x - 'a'] = new Tire();
root = root->next[x - 'a'];
}
root->is_ok = true;
}
//寻找是否存于前缀树中
string isstring(string sentence)
{
auto root = this;
string ok;
for (auto x : sentence)
{
if (root->is_ok == true)
return ok;
if (root->next[x - 'a'] == nullptr)
return sentence;
ok += x;
root = root->next[x - 'a'];
}
return sentence;
}
};
class Solution {
public:
//解决方法函数
string replaceWords(vector<string>& dictionary, string sentence) {
auto i = dictionary.size();
auto w = sentence.size();
Tire tire;
for (int j = 0; j != i; ++j)
{
//建立字典前缀树
tire.insert(dictionary[j]);
}
string temp = "";
string out = "";
//采用输入流,使句子分割为单词
stringstream strstream(sentence);
while (strstream >> temp)
out+=tire.isstring(temp)+" ";
//最后一个单词后没有空格
out.pop_back();
cout << out << endl;
return out;
}
};