Cool说丨力扣648

简介: 648. 单词替换

648. 单词替换

在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。

现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。

你需要输出替换之后的句子。

示例 1:

输入: dict(词典) = ["cat", "bat", "rat"]

sentence(句子) = "the cattle was rattled by the battery"

输出: "the cat was rat by the bat"

注:

  1. 输入只包含小写字母。
  2. 1 <= 字典单词数 <=1000
  3. 1 <=  句中词语数 <= 1000
  4. 1 <= 词根长度 <= 100
  5. 1 <= 句中词语长度 <= 1000

第一版,自己写的,比较慢

执行用时 :384 ms, 在所有 cpp 提交中击败了19.37%的用户

内存消耗 :112.3 MB, 在所有 cpp 提交中击败了20.75%的用户

boolstaticcompare(conststring&a, conststring&b) {

   returna.size() <b.size();

}

stringreplaceWords(vector<string>&dict, stringsentence) {

   sort(dict.begin(), dict.end(), compare);

   stringtemp,result;

   for (unsignedi=0; i<sentence.size(); ++i) {

       temp="";

       while (sentence[i] !=' '&&i<sentence.size()) {

           temp+=sentence[i++];

       }

       for (auto&d : dict) {

           if (temp.substr(0, d.size()) ==d) {

               temp=d;

               break;

           }

       }

       result+=temp;

       result+=" ";

   }

   returnresult.substr(0, result.size() -1);

}

第二版,改进了一点

执行用时 :108 ms, 在所有 cpp 提交中击败了52.57%的用户

内存消耗 :19.5 MB, 在所有 cpp 提交中击败了92.45%的用户

stringreplaceWords(vector<string>&dict, stringsentence) {

   unordered_set<string>unst(dict.begin(), dict.end());

   stringtemp,result;

   for (unsignedi=0; i<sentence.size(); ++i) {

       temp="";

       while (sentence[i] !=' '&&i<sentence.size()) {

           temp+=sentence[i];

           if (unst.find(temp) !=unst.end()) {//此时已经找到了前缀了

               break;

           }

           i++;

       }

       result+=temp;

       result+=" ";

       while (sentence[i] !=' '&&i<sentence.size())

       {

           ++i;

       }//将整个单词跨过去。直到遇到空格  

   }

   returnresult.substr(0, result.size() -1);

}


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
201 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
176 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
215 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
177 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
154 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
230 0
|
C#
Cool说丨力扣475
475. 供暖器
185 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
162 0
|
C#
Cool说丨力扣167
167. 两数之和 II - 输入有序数组
168 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
176 0

热门文章

最新文章