在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。

现在,给定一个由许多词根组成的词典 dictionary 和一个用空格分隔单词形成的句子 sentence。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。

你需要输出替换之后的句子。

思路与算法:

首先得保证词典中元素唯一性,可以通过对词典的遍历,添加到Set集合中,Set集合具有元素不重复的性质。

题目所给字符串存在空格符号,那么就需要将其清除并返回整个字符串的每一个单词,可以通过String类中spilt()方法进行截取并返回字符串数组;spilt(" ")方法:围绕给定正则表达式的匹配项拆分此字符串。按照空格对字符串进行单词获取。

具体例子:

dictionary = ["cat", "bat", "rat"]

sentence = "the cattle was rattled by the battery"

数组words = {"the", "cattle ", "was ", "rattled ", "by ", "the ", "battery"}

题目还需要最短词根进行替换,那么还需要对每个单词字符串进行匹配,不匹配元素无需更改;匹配元素寻找最短词根,只需模糊匹配contains()方法即可,当符合要求时对单词进行词根替换,就可以结束掉单词字符串的遍历啦。

此时数组words = {"the", "cat", "was ", "rat", "by ", "the ", "bat"}

最后需要对字符数组转换为字符串输出,那么需要在中间添加空格,首位不进行任何操作,简单一点可以从[1-(length-1))索引遍历添加空格,或者用三元也可以;但JDK8.0中为String类添加了join()方法,这为我们提供很好的简化代码,解决了字符串拼接首尾不添加符号的需求,当然也可以使用StringUtils.join方法,字符串最好还是使用自己的就好。看自己喜欢进行选择就好啦,代码能跑万事皆休嘛。

class Solution {
    public String replaceWords(List<String> dictionary, String sentence) {
        // 防止词典中元素重复
        Set<String> dictionarySet = new HashSet<String>();
        for (String root : dictionary) {
            dictionarySet.add(root);
        }
        // spilt()围绕给定正则表达式的匹配项拆分此字符串。按照空格对字符串进行单词获取
        String[] words = sentence.split(" ");
        // 遍历单词数组
        for (int i = 0; i < words.length; i++) {
            // 获取当前索引下的单词
            String word = words[i];
            // 遍历单词的每个字母
            for (int j = 0; j < word.length(); j++) {
                // 获取单词的子串,这可以将继承词用最短的词根替换
                if (dictionarySet.contains(word.substring(0, 1 + j))) {
                    // 进行单词修改,结束循环
                    words[i] = word.substring(0, 1 + j);
                    break;
                }
            }
        }
        // join()返回一个新的 String,该字符串由联接在一起的副本与指定的副本组成。
        // 解决了字符串拼接首尾不添加符号的需求, 也可以使用StringUtils.join方法,字符串最好还是使用自己的就好
        return String.join(" ", words);
    }
}