刷题的日常-单词替换

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png