📌  相关文章
📜  国际空间研究组织 | ISRO CS 2007 |问题 45(1)

📅  最后修改于: 2023-12-03 15:07:33.261000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2007 |问题 45

这是一道来自于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])