题目描述
在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
你需要输出替换之后的句子。
注:
输入只包含小写字母。
1 <= 字典单词数 <=1000
1 <= 句中词语数 <= 1000
1 <= 词根长度 <= 100
1 <= 句中词语长度 <= 1000
样例
示例 1:
输入: dict(词典) = [“cat”, “bat”, “rat”]
sentence(句子) = “the cattle was rattled by the battery”
输出: “the cat was rat by the bat”
算法1
(暴力枚举) $O(nl)$
blablabla
时间复杂度分析:blablabla
C++ 代码
const int N = 100000;
class Solution {
int son[N][26], cnt[N], idx;
void add(string word){
int p = 0;
for (int i=0; i<word.size(); i++){
int u = word[i] - 'a';
if (!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
cnt[p]++;
}
string find(string word){
int p = 0;
for (int i=0; i< word.size(); i++){
int u = word[i] - 'a';
if (cnt[p]) return word.substr(0, i);
if (!son[p][u]) break;
p = son[p][u];
}
return word;
}
public:
string replaceWords(vector<string>& dict, string sentence) {
for (auto word:dict) add(word);
int last = 0; string res = "";
for (int i=0; i < sentence.size(); i++){
if (sentence[i]==' ') {
res += find(sentence.substr(last, i-last))+" ";
last = i+1;
}
}
res += find(sentence.substr(last, sentence.size()-last));
return res;
}
};
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度分析:blablabla
C++ 代码
blablabla