在我的Java函数中实现搜索

时间:2018-08-16 05:07:16

标签: java

我需要一个Java代码,该代码选择两个单词之间的最短路径,每个步骤仅更改一个字母。我想实施深度优先搜索;我认为那可以解决我的问题。我正在阅读它,但是我不知道如何实现它。有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

我在评论中高估了一些问题约束;这实际上是一个非常简单的BFS问题。 DFS是不适当的,因为它在探索根节点附近的节点的邻居之前,会沿着每条路径一直到达终端节点。这意味着无法保证最短路径。另一方面,BFS首先探索附近的节点,并保证最短的路径。这个问题很好地说明了这两种方法之间的区别。

您当前的实现是递归的,它将调用堆栈用作DFS数据结构。由于堆栈是后进先出(LIFO)结构,因此当前节点的邻居将被快速掩埋在首先弹出并探索的那些邻居的邻居之下。

以下是使用队列(先进先出或FIFO)将您的find方法作为BFS的实现:

def find(start, target, words):
    alpha = [chr(x) for x in range(97, 123)]
    visited = {start: None}
    queue = [start]

    while queue:
        curr = queue.pop(0)

        if curr == target:
            path = []

            while curr:
                path.insert(0, curr)
                curr = visited[curr]

            return path

        letters = list(curr)

        for i, c in enumerate(letters):
            for letter in alpha:
                new_word = "".join(letters[:i]) + letter + "".join(letters[i+1:])

                if new_word in words and new_word not in visited:
                    visited[new_word] = curr
                    queue.append(new_word)


words = set([w.strip() for w in open("dictionary.txt").readlines()])
print(find("lead", "gold", words))
print(find("hide", "seek", words))

输出:

['lead', 'load', 'goad', 'gold']
['hide', 'bide', 'bids', 'beds', 'bees', 'sees', 'seek']

请注意,第二条路径与您的示例一样短,但是使用了另一条路径。如果需要,您可以轻松地调整算法以计算所有最短路径。

相反,将队列更改为堆栈的简单修改(一个字符更改:pop(0) -> pop()向我们展示了DFS的结果:

['lead', 'leas', 'leys', 'lays', 'laws', 'lawn', 'lain', 'lair', 'wair', 'wait', 'watt', 'wats', 'wars', 'wary', 'wavy', 'wave', 'wane', 'wand', 'wynd', 'wyns', 'wyes', 'woes', 'wows', 'yows', 'yowl', 'yawl', 'yawp', 'yaup', 'yaud', 'yard', 'yarn', 'tarn', 'tart', 'taut', 'taus', 'tavs', 'vavs', 'vans', 'vang', 'yang', 'yank', 'yack', 'yuck', 'yuch', 'yech', 'yeah', 'year', 'wear', 'wean', 'ween', 'weet', 'west', 'wost', 'wort', 'worn', 'sorn', 'sori', 'soli', 'sols', 'soys', 'soya', 'soma', 'some', 'sone', 'song', 'sung', 'suns', 'suss', 'sass', 'sash', 'wash', 'wasp', 'wisp', 'wiss', 'wigs', 'zigs', 'zits', 'ziti', 'titi', 'tipi', 'tips', 'tins', 'tiny', 'tidy', 'tide', 'tire', 'tiro', 'tyro', 'typo', 'type', 'tyne', 'tune', 'tuna', 'tufa', 'tuft', 'toft', 'tofu', 'tolu', 'toll', 'tool', 'toon', 'town', 'towy', 'tory', 'tors', 'tots', 'tote', 'toke', 'take', 'taka', 'taxa', 'taxi', 'tali', 'talk', 'task', 'tusk', 'tush', 'tosh', 'toph', 'soph', 'soth', 'sith', 'site', 'size', 'bize', 'bise', 'bisk', 'birk', 'birr', 'bier', 'beer', 'bees', 'bets', 'beth', 'bath', 'bate', 'bare', 'barm', 'balm', 'bals', 'bams', 'bums', 'bump', 'burp', 'bury', 'busy', 'bust', 'butt', 'bott', 'bota', 'bora', 'mora', 'more', 'move', 'rove', 'roue', 'roux', 'doux', 'dour', 'dorr', 'dorp', 'gorp', 'goop', 'goos', 'gods', 'gids', 'gies', 'gien', 'girn', 'girt', 'gist', 'gast', 'vast', 'vase', 'vale', 'vole', 'volt', 'molt', 'moly', 'mopy', 'mops', 'moss', 'mosk', 'monk', 'mono', 'mozo', 'bozo', 'bolo', 'bold', 'gold']
['hide', 'hive', 'hove', 'howe', 'hows', 'hoys', 'hoya', 'hora', 'horn', 'hern', 'hers', 'hets', 'heth', 'hath', 'hate', 'haze', 'hazy', 'mazy', 'many', 'mans', 'mays', 'mayo', 'mako', 'make', 'mare', 'mart', 'maut', 'maun', 'mawn', 'mown', 'moon', 'moot', 'mott', 'mots', 'moss', 'mosk', 'monk', 'mono', 'mozo', 'bozo', 'boyo', 'toyo', 'toro', 'tory', 'towy', 'cowy', 'cowl', 'cool', 'coos', 'cops', 'cope', 'cote', 'cute', 'cuts', 'cuss', 'cusk', 'cask', 'cast', 'cant', 'cane', 'cave', 'cavy', 'caky', 'laky', 'lakh', 'lash', 'lass', 'laws', 'yaws', 'yawp', 'yaup', 'yaud', 'yard', 'yarn', 'warn', 'wary', 'waly', 'wall', 'wawl', 'pawl', 'pail', 'pair', 'parr', 'pars', 'pats', 'paty', 'pity', 'pith', 'pish', 'piss', 'pips', 'pipe', 'pine', 'pint', 'punt', 'puny', 'pony', 'pons', 'poms', 'pomp', 'poop', 'poor', 'pour', 'pout', 'post', 'pose', 'pore', 'pork', 'pock', 'poco', 'polo', 'poll', 'pull', 'puls', 'pugs', 'pugh', 'vugh', 'vugg', 'mugg', 'migg', 'migs', 'mirs', 'miry', 'airy', 'airt', 'girt', 'giro', 'gyro', 'gyre', 'gybe', 'gibe', 'gibs', 'gins', 'gink', 'gunk', 'guck', 'geck', 'geek', 'seek']

如您所见,这根本不是最短的路径!

答案 1 :(得分:-1)

我认为我们在同一堂课上,并且分配相同的作业。请注意,您在网上发布的内容(尤其是您的代码)要小心,因为它可能会被我们的讲师发现,但由于违反学术政策(特别是窃)而导致您的作业失败。 :)