作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/replace-words/description/

题目描述

In English, we have a concept called root, which can be followed by some other words to form another longer word - let’s call this word successor. For example, the root an, followed by other, which can form another word another.

Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor in the sentence with the root forming it. If a successor has many roots can form it, replace it with the root with the shortest length.

You need to output the sentence after the replacement.

Example 1:

Input: dict = ["cat", "bat", "rat"]
sentence = "the cattle was rattled by the battery"
Output: "the cat was rat by the bat"

Note:

  1. The input will only have lower-case letters.
  2. 1 <= dict words number <= 1000
  3. 1 <= sentence words number <= 1000
  4. 1 <= root length <= 100
  5. 1 <= sentence words length <= 1000

题目大意

把句子中的每个单词用给的字典进行替换,替换时优先替换成最短的词。替换就是找出最短的头部匹配;如果字典中不存在,就保留原来的词。

解题方法

set

看了下给出的Note,发现并没有特别长,普通的方法应该就能搞定,不会超时。

下面的方法叫做Prefix Hash,对于python而言就是用了set的意思。

class Solution(object):
def replaceWords(self, dict, sentence):
"""
:type dict: List[str]
:type sentence: str
:rtype: str
"""
rootset = set(dict)
def replace(word):
for i in xrange(len(word)):
if word[:i] in rootset:
return word[:i]
return word
return ' '.join(map(replace, sentence.split()))

字典

用数组保存dict中,每个小写字符开头的单词。然后对给出的句子进行遍历每个单词,判断这个单词能不能用更短的前缀替换。题目中要求用尽可能短的单词进行替换,所以需要排序,让短的单词在前面。

class Solution {
public:
string replaceWords(vector<string>& dict, string sentence) {
vector<vector<string>> m(26);
sort(dict.begin(), dict.end(), [](string a, string b) {
return a.size() < b.size();});
for (string s : dict)
m[s[0] - 'a'].push_back(s);
istringstream is(sentence);
string cur;
string res;
while (is >> cur) {
for (string word : m[cur[0] - 'a']) {
if (word == cur.substr(0, word.size())) {
cur = word;
break;
}
}
res += cur + ' ';
}
res.pop_back();
return res;
}
};

前缀树

前缀树,又称字典树Trie。具体实现可以看208. Implement Trie (Prefix Tree)

这个题里面,使用了Trie。做法比较简单,把所有的字典前缀放入Trie里面,然后再查句子每个单词是否在里面即可。

需要注意的是,我们的根节点没有存储字符,遍历Trie的时候,p的child数组是我们对应的当前字符。如果当前节点是单词,就直接返回了。如果当前节点不是单词,然后它的child又是空,说明不符合要查找的字符串。就返回掉原始字符串即可。

class TrieNode {
public:
vector<TrieNode*> child;
bool isWord;
TrieNode() : isWord(false), child(26, nullptr){};
~TrieNode() {
for (auto& a : child)
delete a;
}
};
class Solution {
public:
string replaceWords(vector<string>& dict, string sentence) {
root = new TrieNode();
for (string& d : dict) {
insert(d);
}
istringstream is(sentence);
string res;
string cur;
while (is >> cur) {
res += getPrefix(cur) + ' ';
}
res.pop_back();
return res;
}
string getPrefix(string word) {
TrieNode* p = root;
string path;
for (char& c : word) {
int i = c - 'a';
if (p->isWord)
return path;
if (!p->child[i])
return word;
path += c;
p = p->child[i];
}
return word;
}
void insert(string word) {
TrieNode* p = root;
for (char& c : word) {
int i = c - 'a';
if (!p->child[i])
p->child[i] = new TrieNode();
p = p->child[i];
}
p->isWord = true;
}
private:
TrieNode* root;
};

日期

2018 年 2 月 27 日
2018 年 12 月 18 日 —— 改革开放40周年

【LeetCode】648. Replace Words 解题报告(Python & C++)的更多相关文章

  1. 【LeetCode】120. Triangle 解题报告(Python)

    [LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...

  2. LeetCode 1 Two Sum 解题报告

    LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...

  3. 【LeetCode】Permutations II 解题报告

    [题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...

  4. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  5. 【LeetCode】01 Matrix 解题报告

    [LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ...

  6. 【LeetCode】Largest Number 解题报告

    [LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...

  7. 【LeetCode】Gas Station 解题报告

    [LeetCode]Gas Station 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/gas-station/#/descr ...

  8. LeetCode: Unique Paths II 解题报告

    Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution  Fol ...

  9. Leetcode 115 Distinct Subsequences 解题报告

    Distinct Subsequences Total Accepted: 38466 Total Submissions: 143567My Submissions Question Solutio ...

随机推荐

  1. Linux中shell去除空行的几种方法

    有时我们在处理和查看文件时,经常会有很多空行,为了美观或是有需要时,就有必要把这些除行去掉了,方法如下: #如需将结果输出加入重定向        > 文件名 1)用tr命令 代码如下: cat ...

  2. CentOS6忘记root密码如何重置

    CentOS6忘记root密码,如何重置密码 ①     重启服务器,按"e"键进入修改系统开机项界面 ②    选择内核项,按"e"进入其中进行配置 在文件内 ...

  3. Scala(五)【集合的高级使用】

    目录 一.集合属性 size length contains mkString 二.集合方法 drop.dropRight distinct:去重 head.last:获取第一个.最后一个元素 tai ...

  4. Hive(九)【自定义函数】

    目录 自定义函数 编程步骤 案例 需求 1.创建工程 2.导入依赖 3.创建类 4.打jar包 5.上传hive所在服务器 6.将jar添加到hive的classpath 7.创建临时函数与开发好的j ...

  5. 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户

    1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...

  6. winXP 下安装python3.3.2

    1. 安装python-3.3.2 2. 安装setuptools 下载解压后,进入路径 python setup.py install 3.安装pip 下载解压后,进入路径 python setup ...

  7. linux下怎么查看某个命令属于哪个包

    # yum whatprovides */ip  或者 # yum provides */ip 即可

  8. AI ubantu 环境安装

    ubantu安装记录 apt install python3-pip anaconda安装 https://repo.anaconda.com/archive/Anaconda3-2020.11-Li ...

  9. 注册页面的servlet

    package cn.itcast.travel.web.servlet;import cn.itcast.travel.domain.ResultInfo;import cn.itcast.trav ...

  10. Android CameraX 打开摄像头预览

    目标很简单,用CameraX打开摄像头预览,实时显示在界面上.看看CameraX有没有Google说的那么好用.先按最简单的来,把预览显示出来. 引入依赖 模块gradle的一些配置,使用的Andro ...