近义词句子
难度:
标签:
题目描述
代码结果
运行时间: 32 ms, 内存: 0.0 MB
/*
题目思路:
1. 使用stream API简化操作。
2. 定义一个方法来生成近义词句子。
3. 使用递归或回溯方法来生成所有可能的句子组合。
4. 对每个单词,替换成它的近义词,并生成新的句子。
5. 最终返回所有可能的句子。
*/
import java.util.*;
import java.util.stream.Collectors;
public class SynonymousSentencesStream {
public List<String> generateSentences(List<List<String>> synonyms, String text) {
Map<String, List<String>> map = new HashMap<>();
for (List<String> pair : synonyms) {
map.putIfAbsent(pair.get(0), new ArrayList<>());
map.putIfAbsent(pair.get(1), new ArrayList<>());
map.get(pair.get(0)).add(pair.get(1));
map.get(pair.get(1)).add(pair.get(0));
}
String[] words = text.split(" ");
List<String> result = new ArrayList<>();
generate(words, 0, map, new StringBuilder(), result);
return result;
}
private void generate(String[] words, int index, Map<String, List<String>> map, StringBuilder sb, List<String> result) {
if (index == words.length) {
result.add(sb.toString().trim());
return;
}
String word = words[index];
List<String> synonyms = map.getOrDefault(word, Arrays.asList(word));
synonyms.stream().forEach(synonym -> {
int len = sb.length();
sb.append(synonym).append(" ");
generate(words, index + 1, map, sb, result);
sb.setLength(len);
});
}
public static void main(String[] args) {
SynonymousSentencesStream ss = new SynonymousSentencesStream();
List<List<String>> synonyms = Arrays.asList(Arrays.asList("happy", "joyful"), Arrays.asList("sad", "sorrow"));
String text = "I am happy today but was sad yesterday";
List<String> sentences = ss.generateSentences(synonyms, text);
sentences.forEach(System.out::println);
}
}
解释
方法:
题解采用了回溯算法来生成所有可能的句子。首先,通过建立一个映射表 `similarWords` 来记录每个单词可以互为近义词的所有单词。然后使用 `backtracker` 函数递归地探索每个单词的所有可能的近义词替换,生成所有可能的句子组合。最后,将结果排序后返回。
时间复杂度:
O((m+1)^n)
空间复杂度:
O(n + k)
代码细节讲解
🦆
在构建`similarWords`映射表时,如果两个单词均未出现过,为什么只建立它们之间的双向映射而不是将它们与其他已有单词的关系也考虑进去?
▷🦆
在处理已有单词与未出现过的单词建立映射时,为什么只将新单词与已有单词的近义词建立关系,而不是直接加入到已有单词的近义词集合中?
▷🦆
为什么在`backtracker`函数中,每次递归调用都先尝试不替换当前单词,这种策略对结果有何影响?
▷🦆
当使用`backtracker`函数进行递归时,为什么需要在每次递归结束后恢复原来的单词(`wordsList[curIndex] = originalWord`)?
▷