在英语中,我们有一个叫做 词根(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);
}
}
















