LeetCode 648. 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:
1 class Solution { 2 public String replaceWords(List<String> dict, String sentence) { 3 if(sentence == null || sentence.length() == 0 || dict == null || dict.size() == 0){ 4 return sentence; 5 } 6 7 Trie trie = new Trie(); 8 for(String word : dict){ 9 trie.insert(word); 10 } 11 12 String [] tokens = sentence.split("\\s+"); 13 14 StringBuilder sb = new StringBuilder(); 15 for(String token : tokens){ 16 sb.append(getRootOrDefault(token, trie) + " "); 17 } 18 19 sb.deleteCharAt(sb.length()-1); 20 return sb.toString(); 21 } 22 23 private String getRootOrDefault(String s, Trie trie){ 24 StringBuilder sb = new StringBuilder(); 25 for(int i = 0; i<s.length(); i++){ 26 sb.append(s.charAt(i)); 27 if(trie.search(sb.toString())){ 28 return sb.toString(); 29 }else if(!trie.startsWith(sb.toString())){ 30 return s; 31 } 32 } 33 return s; 34 } 35 } 36 37 class Trie{ 38 private TrieNode root; 39 40 public Trie(){ 41 root = new TrieNode(); 42 } 43 44 public void insert(String word){ 45 TrieNode p = root; 46 for(char c : word.toCharArray()){ 47 if(p.nexts[c-'a'] == null){ 48 p.nexts[c-'a'] = new TrieNode(); 49 } 50 p = p.nexts[c-'a']; 51 } 52 53 p.val = word; 54 } 55 56 public boolean search(String word){ 57 TrieNode p = root; 58 for(char c : word.toCharArray()){ 59 if(p.nexts[c-'a'] == null){ 60 return false; 61 } 62 p = p.nexts[c-'a']; 63 } 64 return p.val.equals(word); 65 } 66 67 public boolean startsWith(String word){ 68 TrieNode p = root; 69 for(char c : word.toCharArray()){ 70 if(p.nexts[c-'a'] == null){ 71 return false; 72 } 73 p = p.nexts[c-'a']; 74 } 75 return true; 76 } 77 } 78 79 class TrieNode{ 80 String val = ""; 81 TrieNode [] nexts; 82 83 public TrieNode(){ 84 nexts = new TrieNode[26]; 85 } 86 }
Another implementation.
1 class Solution { 2 public String replaceWords(List<String> dict, String sentence) { 3 if(sentence == null || sentence.length() == 0 || dict == null || dict.size() == 0){ 4 return sentence; 5 } 6 7 TrieNode root = new TrieNode(); 8 for(String word : dict){ 9 TrieNode p = root; 10 for(char c : word.toCharArray()){ 11 if(p.nexts[c-'a'] == null){ 12 p.nexts[c-'a'] = new TrieNode(); 13 } 14 15 p = p.nexts[c-'a']; 16 } 17 18 p.val = word; 19 } 20 21 String [] words = sentence.split("\\s+"); 22 for(int i = 0; i<words.length; i++){ 23 TrieNode p = root; 24 for(char c : words[i].toCharArray()){ 25 if(p.nexts[c-'a'] == null || p.val != null){ 26 break; 27 } 28 29 p = p.nexts[c-'a']; 30 } 31 32 words[i] = (p.val == null) ? words[i] : p.val; 33 } 34 35 return String.join(" ", words); 36 } 37 } 38 39 class TrieNode{ 40 String val; 41 TrieNode [] nexts; 42 43 public TrieNode(){ 44 nexts = new TrieNode[26]; 45 } 46 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 在 VS Code 中,一键安装 MCP Server!
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 千万级大表的优化技巧
2015-11-13 LeetCode 304. Range Sum Query 2D - Immutable
2015-11-13 LeetCode 303. Range Sum Query - Immutable
2015-11-13 LeetCode 301. Remove Invalid Parentheses