问题条件:打印满足条件的所有可能的城市序列:当前单词的最后一个字母对应下一个单词的第一个字母。我正在使用 N 个城市的列表,我正在将一系列由空格分隔的城市写入文件。序列本身是分开的\n。我想通过列表中的所有单词实现一个循环,该循环将初始化一个循环的开始,该循环将创建由该单词初始化的序列。例如:
[milltimber, ringwood, dundonald, londonderry, ystrad]
输出序列:
milltimber ringwood dundonald
ringwood dundonald
londonderry ystrad dundonald
ystrad dundonald
我的实现是这样的:
for city_1 in cities_list:
создаем список cities_list_iterable и удаляем из него city_1
for city_2 in cities_list_iterable:
Проверяем, совпадает ли первая буква city_2 с последней буквой city_1, и если да:
добавляем city_2 в текущую последовательность, удаляем его из cities_list_iterable
присваиваем city_1 значение city_2
然而,通过这个实现,我们需要返回到循环的开头,for city_2 in cities_list_iterable:
以便再次开始检查尚未删除的城市是否符合条件。我不明白该怎么做。另外,我不确定这个算法的正确性以及它的最优性。我通过图表考虑了解决方案,但不太明白在这种情况下如何找到所有序列。算法的最优性很重要,所以我请你提出解决问题的其他选项。
您的问题属于在图上查找路径的问题。
首先,我们在词节点之间建立一个邻接矩阵。如果输出节点处的单词以与该边缘指向的节点处开始的单词相同的字母结尾,则节点通过有向链路互连。
之后,我们忘记了单词,只使用矩阵。我们遍历所有顶点,并从每个顶点构建所有可能的链路径,依次增加层数。
由于您没有任何限制,这只是一个迭代任务。该算法很可能是递归的。
这是关于这样的事情。甚至有可能找到现成的实现。