题目
在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
需要输出替换之后的句子。
示例
输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”
输入:dictionary = [“a”,“b”,“c”], sentence = “aadsfasf absbs bbab cadsfafs”
输出:“a a b c”
输入:dictionary = [“a”, “aa”, “aaa”, “aaaa”], sentence = “a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa”
输出:“a a a a a a a a bbb baba a”
输入:dictionary = [“catt”,“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”
输入:dictionary = [“ac”,“ab”], sentence = “it is abnormal that this solution is accepted”
输出:“it is ab that this solution is ac”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/UhWRSj
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:模拟
1、将dictionary存入数组flag中,并排序。
2、句子中的每个单词都和flag对比,看是否是前缀。
Java实现
class Solution {
public String replaceWords(List<String> dictionary, String sentence) {
StringBuffer res = new StringBuffer();
String[] flag = new String[dictionary.size()];
int i = 0;
for (String s : dictionary) {
flag[i++] = s;
}
Arrays.sort(flag);
String[] str = sentence.split(" ");
for (String s : str) {
int len = s.length();
boolean miao = false;
for (int j = 0; j < flag.length; j++) {
if (s.startsWith(flag[j])) {
res.append(flag[j]);
res.append(" ");
miao = true;
break;
}
}
if (miao == false) {
res.append(s);
res.append(" ");
}
}
return res.toString().strip();
}
}