开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
刷题的日常-2022年12月7号
一天一题,保持脑子清爽
单词替换
来自leetcode的 648 题,题意如下:
在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典 dictionary 和一个用空格分隔单词形成的句子 sentence。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
你需要输出替换之后的句子。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个字典 和 一个字符串
- 要求我们返回字符串中每个单词在字典中出现的词根
做题思路
这里采用前缀树解题,刚好可以匹配词根。步骤如下:
- 根据字典创建词根前缀树
- 将字符串根据空格进行切分
- 循环切分出来的每一个数据
- 挨个数据进行匹配,匹配过程中第一个出现的前缀就返回
- 最后将匹配前缀的结果再用空格连接起来
代码实现
代码实现如下:
public class Solution {
public String replaceWords(List<String> dictionary, String sentence) {
TireTree root = createTree(dictionary);
List<String> result = new ArrayList<>();
String[] strArr = sentence.split(" ");
for (String str : strArr) {
result.add(match(root, str));
}
return join(result);
}
private String join(List<String> result) {
if (result.isEmpty()) {
return null;
}
StringBuilder sb = new StringBuilder(result.get(0));
for (int i = 1; i < result.size(); i++) {
sb.append(" ").append(result.get(i));
}
return sb.toString();
}
private String match(TireTree root, String str) {
for (int i = 0; i < str.length(); i++) {
root = root.root[str.charAt(i) - 'a'];
if (root == null) {
break;
}
if (root.hasWord) {
return root.word;
}
}
return str;
}
}