哈工大2020软件构造Lab2
Problem1.4 Graph Poet
问题简述:给定一组单词(文件输入),对于两个相邻的单词a和b,认为存在一条由a到b的有向边,通过Graph接口构造有向图。再给定一由单词组成的句子,如果句子中两个相邻单词之间在Graph图中有一个中间单词则将中间单词插入到两单词之间(如果有多个则插入权重最大的那个)
读入单词
- 使用文件输入
-
参考文章
String.split()
分割为数组- 通过
String.toLowerCase()
小写化
核心1:构建图
- 要求:相邻的单词加边
- 首先要在加边前通过
Graph.add()
加点
graph.add(words[i].toLowerCase());
- 加边时要判断是否存在:由于
Graph.set()
能返回之前加的边的值,以此来判断是否存在,存在则在之前的值加一(之前的边的值保存为lastEdgeWeight
)
int lastEdgeWeight = graph.set(words[i - 1].toLowerCase(), words[i].toLowerCase(), 1);
if (lastEdgeWeight != 0)
graph.set(words[i - 1].toLowerCase(), words[i].toLowerCase(), lastEdgeWeight + 1);
- n个点加n-1条边
for (int i = 0; i < words.length; i++)
核心2:扩展Poem
for (int i = 1; i < words.length; i++)
- 当相邻两个单词任意一个不在之前创建的图里,则将后者单词加入即可(再加个空格)
if (!vertices.contains(words[i - 1].toLowerCase()) || !vertices.contains(words[i].toLowerCase())) {
answer += " " + words[i];
continue;
}
- 当存在时,由于Bridge长度只能为2,所以:
- 分别求两个单词的
sources
和targets
- 将该
Map
转换为Set
求交集
intersection = sources.keySet();
intersection.retainAll(targets.keySet());
- 若交集为空,则无桥
- 若交集不空,则在交集中找最短的桥(可以在Map的value中查询weight)
for (String key : intersection) {
if (sources.get(key) + targets.get(key) > maxBridge) {
maxBridge = sources.get(key) + targets.get(key);
bridge = key;
}
}
- 最后加入新生成的Poem