哈工大2020软件构造Lab2 Problem1.4 Graph Poet 思路

哈工大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,所以:
  • 分别求两个单词的sourcestargets
  • 将该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

猜你喜欢

转载自blog.csdn.net/gzn00417/article/details/104879996