题目描述
在英语中,我们有一个叫做 词根(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”
以下用于获取句子中的string,不包括空格。
stringstream ssin(sentence);
while(ssin>>ss)
将字典中的单词换成字符串哈希,分别遍历句子中的每个单词,遍历每个单词的时候分别计算前缀和哈希,如果计算的结果存在于字典中,那么返回结果。
typedef unsigned long long ULL;
const int P=131;
class Solution {
public:
string replaceWords(vector<string>& dictionary, string sentence) {
unordered_set<ULL> hash;
for(auto x:dictionary)
{
ULL h=1;
for(auto i:x) h=h*P+i;
hash.insert(h);
}
stringstream ssin(sentence);
string ss,res;
while(ssin>>ss)
{
string s;
ULL h=1;
for(auto x:ss)
{
s+=x;
h=h*P+x;
if(hash.count(h)) break;
}
res+=s+' ';
}
res.pop_back();
return res;
}
};
Python的话,多么简洁
class Solution(object):
def replaceWords(self, dictionary, sentence):
"""
:type dictionary: List[str]
:type sentence: str
:rtype: str
"""
root=set(dictionary)
def replace(word):
for i in xrange(1,len(word)):
if word[:i] in root:
return word[:i]
return word
return " ".join(map(replace,sentence.split()))

该博客介绍了一种方法,通过哈希和前缀匹配来替换句子中的单词,使得句子中的单词被其词根所代替。算法首先建立词典的哈希集合,然后遍历句子,对每个单词计算哈希,如果哈希存在于词典哈希集中,就用词根替换。示例展示了在不同词典下如何应用此方法,强调了在存在多个词根时选择最短的一个进行替换的原则。
&spm=1001.2101.3001.5002&articleId=119640957&d=1&t=3&u=1877302b9e37491284ad2f9b6ab33b8e)
784

被折叠的 条评论
为什么被折叠?



