原题链接在这里: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

题解:

利用Trie树. 把dict中每个词先放进Trie树中.

对于sentence按照空格拆分出的token, 从头添加token的char, 试验是否能在Trie树中找到. 找到说明加到这就是个root了, 可以返回.

若是Trie树中都没有starts with当前值时说明这个token 没有root, 返回原token.

Time Complexity: O(n*m + k*p). n = dict.size(). m是dict中单词平均长度. k是sentence中token个数. p是token平均长度.

Space: O(n*m+k).

AC Java:

 class Solution {
public String replaceWords(List<String> dict, String sentence) {
if(sentence == null || sentence.length() == 0 || dict == null || dict.size() == 0){
return sentence;
} Trie trie = new Trie();
for(String word : dict){
trie.insert(word);
} String [] tokens = sentence.split("\\s+"); StringBuilder sb = new StringBuilder();
for(String token : tokens){
sb.append(getRootOrDefault(token, trie) + " ");
} sb.deleteCharAt(sb.length()-1);
return sb.toString();
} private String getRootOrDefault(String s, Trie trie){
StringBuilder sb = new StringBuilder();
for(int i = 0; i<s.length(); i++){
sb.append(s.charAt(i));
if(trie.search(sb.toString())){
return sb.toString();
}else if(!trie.startsWith(sb.toString())){
return s;
}
}
return s;
}
} class Trie{
private TrieNode root; public Trie(){
root = new TrieNode();
} public void insert(String word){
TrieNode p = root;
for(char c : word.toCharArray()){
if(p.nexts[c-'a'] == null){
p.nexts[c-'a'] = new TrieNode();
}
p = p.nexts[c-'a'];
} p.val = word;
} public boolean search(String word){
TrieNode p = root;
for(char c : word.toCharArray()){
if(p.nexts[c-'a'] == null){
return false;
}
p = p.nexts[c-'a'];
}
return p.val.equals(word);
} public boolean startsWith(String word){
TrieNode p = root;
for(char c : word.toCharArray()){
if(p.nexts[c-'a'] == null){
return false;
}
p = p.nexts[c-'a'];
}
return true;
}
} class TrieNode{
String val = "";
TrieNode [] nexts; public TrieNode(){
nexts = new TrieNode[26];
}
}

Another implementation.

 class Solution {
public String replaceWords(List<String> dict, String sentence) {
if(sentence == null || sentence.length() == 0 || dict == null || dict.size() == 0){
return sentence;
} TrieNode root = new TrieNode();
for(String word : dict){
TrieNode p = root;
for(char c : word.toCharArray()){
if(p.nexts[c-'a'] == null){
p.nexts[c-'a'] = new TrieNode();
} p = p.nexts[c-'a'];
} p.val = word;
} String [] words = sentence.split("\\s+");
for(int i = 0; i<words.length; i++){
TrieNode p = root;
for(char c : words[i].toCharArray()){
if(p.nexts[c-'a'] == null || p.val != null){
break;
} p = p.nexts[c-'a'];
} words[i] = (p.val == null) ? words[i] : p.val;
} return String.join(" ", words);
}
} class TrieNode{
String val;
TrieNode [] nexts; public TrieNode(){
nexts = new TrieNode[26];
}
}

LeetCode Replace Words的更多相关文章

  1. [LeetCode] Replace Words 替换单词

    In English, we have a concept called root, which can be followed by some other words to form another ...

  2. [LeetCode] Find And Replace in String 在字符串中查找和替换

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  3. LeetCode 1234. Replace the Substring for Balanced String

    原题链接在这里:https://leetcode.com/problems/replace-the-substring-for-balanced-string/ 题目: You are given a ...

  4. 【LeetCode】648. Replace Words 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 set 字典 前缀树 日期 题目地址:https:/ ...

  5. 【LeetCode】833. Find And Replace in String 解题报告(Python)

    [LeetCode]833. Find And Replace in String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu ...

  6. LeetCode 648. Replace Words (单词替换)

    题目标签:HashMap 题目给了我们一个array 的 root, 让我们把sentence 里面得每一个word 去掉它得 successor. 把每一个root 存入hash set,然后遍历s ...

  7. [LeetCode] 890. Find and Replace Pattern 查找和替换模式

    You have a list of words and a pattern, and you want to know which words in words matches the patter ...

  8. Leetcode: Find And Replace in String

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  9. 【leetcode】1234. Replace the Substring for Balanced String

    题目如下: You are given a string containing only 4 kinds of characters 'Q', 'W', 'E' and 'R'. A string i ...

随机推荐

  1. IO流参考

    1 import java.io.File; import java.io.FileInputStream; /** * 读取一个字符 */ public class MyReadChar { pub ...

  2. Grid 行和列

    <Grid> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <Co ...

  3. linux中的信号简介和trap命令

    1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ...

  4. React Native导航器之react-navigation使用

    在上一节Navigation组件,我们使用系统提供的导航组件做了一个跳转的例子,不过其实战能力不强,这里推荐一个超牛逼的第三方库:react-navigation.在讲react-navigation ...

  5. Spring_IOC&DI概述

  6. Win10易升是什么?如何彻底关闭Windows10易升?

    很多朋友反馈在使用电脑的时候,突然弹出一个微软Windows10易升的界面,那么Win10易升是什么,怎么样才可以彻底关闭Win10易升呢? win10易升是什么 1.易升是微软官方发布的升级助理或者 ...

  7. Java的Collection集合的常用方法

    boolean add(E e) 添加元素到Collection集合中. boolean addAll(Collection<? extends E> c) 将指定c中的所有元素都添加到此 ...

  8. Django之ModelForm详解

    前言 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来.先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱 ...

  9. SQL命令查询Oracle存储过程信息(代码内容等)

    SELECT * FROM ALL_SOURCE  where TYPE='PROCEDURE'  AND TEXT LIKE '%0997500%'; --查询ALL_SOURCE中,(脚本代码)内 ...

  10. hdu4348区间更新的主席树+标记永久化

    http://acm.hdu.edu.cn/showproblem.php?pid=4348 sb的标记永久化即可,刚开始add和sum没复制过来wa了两发...,操作和原来的都一样,出来单点变成区间 ...