描述
在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典 dictionary 和一个用空格分隔单词形成的句子 sentence。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
你需要输出替换之后的句子。
示例 1:
输入:dictionary = ["cat","bat","rat"], sentence = "the cattle was rattled by the battery"
输出:"the cat was rat by the bat"
示例 2:
输入:dictionary = ["a","b","c"], sentence = "aadsfasf absbs bbab cadsfafs"
输出:"a a b c"
提示:
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 100
dictionary[i] 仅由小写字母组成。
1 <= sentence.length <= 10^6
sentence 仅由小写字母和空格组成。
sentence 中单词的总量在范围 [1, 1000] 内。
sentence 中每个单词的长度在范围 [1, 1000] 内。
sentence 中单词之间由一个空格隔开。
sentence 没有前导或尾随空格。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/replace-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
把前缀都构建成前缀树,后面遍历每个单词时,都去查询是否有公共前缀,有就返回这个前缀,没有则返回整个字符串。
class Solution {
public String replaceWords(List<String> dictionary, String sentence) {
Trie root = new Trie();
for (String str : dictionary) {
Trie cur = root;
for (char c : str.toCharArray()) {
int index = c - 'a';
if (cur.children[index] == null) {
cur.children[index] = new Trie();
}
cur = cur.children[index];
}
cur.end = true;
}
String[] strs = sentence.split("\\ ");
StringBuffer sb = new StringBuffer();
for (String s : strs) {
sb.append(isIn(root,s)+" ");
}
return sb.substring(0,sb.length()-1).toString();
}
public class Trie {
boolean end;
Trie[] children = new Trie[26];
Trie() {
}
}
public String isIn(Trie root, String str) {
Trie cur = root;
StringBuffer sb = new StringBuffer();
for (char c : str.toCharArray()) {
int index = c - 'a';
sb.append(c);
if (cur.children[index] == null) {
return str;
}
cur = cur.children[index];
if (cur.end) {
return sb.toString();
}
}
return str;
}
}