📅  最后修改于: 2023-12-03 15:07:33.261000             🧑  作者: Mango
这是一道来自于2007年ISRO CS考试的编程题目。
下面是题目描述:
一个学生在大学的图书馆里找到了一本很奇怪的书。这本书包括许多单词列表,每个列表定义为一组相邻的单词,每个单词只有一个字母与其前一单词不同。例如,"cat,cot、hot" 是一个此类的单词列表,'bat','fat'是另一个合法的单词列表,但是'eat','tea'不属于此类列表。给定一个单词列表,你的任务是编写一个程序来找到其前导单词,即第一个单词。
输入文件的第一行包含一个整数T,表示测试用例的数量。每个测试用例都以一行开头,其中包含一个整数N,表示该列表中单词的数量。接下来的一行包含N个由小写字母组成的单词.
翻译不好的话,可以参考原题链接。
对于每个测试用例,输出一个单词,表示其前导单词。
2
5
abcd abc ab az a bc
3
abc ac ab
abcd
abc
这道题和82年的一道AT&T笔试题非常相似。可以先对所有单词进行排序,这样相近的单词会距离很近(如果两个字符串只有第一个字符不同,那么排序后它们只相差一个位置)。
再按照顺序去寻找连续的字符串,单词第一个字母不同即为新起点。
这是一个比较经典的“单词接龙”问题,可以使用DFS进行求解。
最终的代码段如下所示,其中用到了一些python3的基础语法:
def isValid(word1, word2):
if (len(word1) != len(word2)):
return False
c = 0
for i in range(len(word1)):
if (word1[i] != word2[i]):
c += 1
if (c > 1):
return False
return (c == 1)
def DFS(graph, visited, currWord, targetWord):
visited[currWord] = True
if (currWord == targetWord):
return True
for i in range(len(graph[currWord])):
if (not visited[graph[currWord][i]]):
if (DFS(graph, visited, graph[currWord][i], targetWord)):
return True
visited[currWord] = False
return False
def solve(words, n):
words.sort()
graph = collections.defaultdict(list)
for i in range(n):
for j in range(i+1, n):
if (isValid(words[i], words[j])):
graph[words[i]].append(words[j])
graph[words[j]].append(words[i])
visited = collections.defaultdict(bool)
for key in sorted(graph.keys()):
if (not visited[key]):
DFS(graph, visited, key, sorted(graph.keys())[len(graph.keys())-1])