LeetCode 648. 单词替换(字符串哈希)

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

题目描述
在英语中,我们有一个叫做 词根(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()))
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值