LeetCode Replace Words
原题链接在这里: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:
- The input will only have lower-case letters.
- 1 <= dict words number <= 1000
- 1 <= sentence words number <= 1000
- 1 <= root length <= 100
- 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的更多相关文章
- [LeetCode] Replace Words 替换单词
		In English, we have a concept called root, which can be followed by some other words to form another ... 
- [LeetCode] Find And Replace in String 在字符串中查找和替换
		To some string S, we will perform some replacement operations that replace groups of letters with ne ... 
- LeetCode 1234. Replace the Substring for Balanced String
		原题链接在这里:https://leetcode.com/problems/replace-the-substring-for-balanced-string/ 题目: You are given a ... 
- 【LeetCode】648. Replace Words 解题报告(Python & C++)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 set 字典 前缀树 日期 题目地址:https:/ ... 
- 【LeetCode】833. Find And Replace in String 解题报告(Python)
		[LeetCode]833. Find And Replace in String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu ... 
- LeetCode 648. Replace Words (单词替换)
		题目标签:HashMap 题目给了我们一个array 的 root, 让我们把sentence 里面得每一个word 去掉它得 successor. 把每一个root 存入hash set,然后遍历s ... 
- [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 ... 
- Leetcode: Find And Replace in String
		To some string S, we will perform some replacement operations that replace groups of letters with ne ... 
- 【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 ... 
随机推荐
- IO流参考
			1 import java.io.File; import java.io.FileInputStream; /** * 读取一个字符 */ public class MyReadChar { pub ... 
- Grid 行和列
			<Grid> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <Co ... 
- linux中的信号简介和trap命令
			1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ... 
- React Native导航器之react-navigation使用
			在上一节Navigation组件,我们使用系统提供的导航组件做了一个跳转的例子,不过其实战能力不强,这里推荐一个超牛逼的第三方库:react-navigation.在讲react-navigation ... 
- Spring_IOC&DI概述
- Win10易升是什么?如何彻底关闭Windows10易升?
			很多朋友反馈在使用电脑的时候,突然弹出一个微软Windows10易升的界面,那么Win10易升是什么,怎么样才可以彻底关闭Win10易升呢? win10易升是什么 1.易升是微软官方发布的升级助理或者 ... 
- Java的Collection集合的常用方法
			boolean add(E e) 添加元素到Collection集合中. boolean addAll(Collection<? extends E> c) 将指定c中的所有元素都添加到此 ... 
- Django之ModelForm详解
			前言 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来.先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱 ... 
- SQL命令查询Oracle存储过程信息(代码内容等)
			SELECT * FROM ALL_SOURCE where TYPE='PROCEDURE' AND TEXT LIKE '%0997500%'; --查询ALL_SOURCE中,(脚本代码)内 ... 
- hdu4348区间更新的主席树+标记永久化
			http://acm.hdu.edu.cn/showproblem.php?pid=4348 sb的标记永久化即可,刚开始add和sum没复制过来wa了两发...,操作和原来的都一样,出来单点变成区间 ... 
