题目
在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
你需要输出替换之后的句子。
示例1
输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”
示例2
输入:dictionary = [“a”,“b”,“c”], sentence = “aadsfasf absbs bbab cadsfafs”
输出:“a a b c”
示例3
输入:dictionary = [“a”, “aa”, “aaa”, “aaaa”], sentence = “a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa”
输出:“a a a a a a a a bbb baba a”
示例4
输入:dictionary = [“catt”,“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”
示例5
输入:dictionary = [“ac”,“ab”], sentence = “it is abnormal that this solution is accepted”
输出:“it is ab that this solution is ac”
题解
class Solution {
public:
string replaceWords(vector<string>& dictionary, string sentence) {
string result="";
string temp="";
unordered_set<string> dic; //将词典中的词转换到set中,降低搜索时的时间复杂度
for (string a : dictionary)
{
dic.insert(a);
}
for(int i = 0;i< sentence.size();i++)
{
if(sentence[i] == ' ') {
result += temp;
result += " ";
temp.clear();
continue;
}
if(i == sentence.size()-1) {
temp += sentence[i];
result += temp;
result += " ";
temp.clear();
break;
}
temp += sentence[i];
if(dic.find(temp) != dic.end()) {
result += temp;
result += " ";
temp.clear();
while(sentence[i] != ' ' && i < sentence.size())
{
i++;
}
}
}
return result.substr(0,result.size()-1);
}
};
注:
unordered_set可以把它想象成一个集合,它提供了几个函数让我们可以增删查:
unordered_set::insert
unordered_set::find
unordered_set::erase
用法:
unordered_set<int> myset;
myset.insert(3);
myset.insert(4);
myset.insert(5);
cout<<myset.size()<<endl;
myset.erase(3);
if(myset.find(3) == myset.end()) {
return 0;
}