- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个java代码来选择两个单词之间的最短路径,每一步只改变一个字母。我想实现深度优先搜索;我认为这会解决我的问题。我正在阅读它,但我不知道如何实现它。有人可以帮助我吗?
最佳答案
我高估了评论中的一些问题限制;这其实是一个非常简单的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']
如您所见,这根本不是最短路径!
关于java - 在我的 java 函数中实现搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51869938/
背景: 我最近一直在使用 JPA,我为相当大的关系数据库项目生成持久层的轻松程度给我留下了深刻的印象。 我们公司使用大量非 SQL 数据库,特别是面向列的数据库。我对可能对这些数据库使用 JPA 有一
我已经在我的 maven pom 中添加了这些构建配置,因为我希望将 Apache Solr 依赖项与 Jar 捆绑在一起。否则我得到了 SolarServerException: ClassNotF
interface ITurtle { void Fight(); void EatPizza(); } interface ILeonardo : ITurtle {
我希望可用于 Java 的对象/关系映射 (ORM) 工具之一能够满足这些要求: 使用 JPA 或 native SQL 查询获取大量行并将其作为实体对象返回。 允许在行(实体)中进行迭代,并在对当前
好像没有,因为我有实现From for 的代码, 我可以转换 A到 B与 .into() , 但同样的事情不适用于 Vec .into()一个Vec . 要么我搞砸了阻止实现派生的事情,要么这不应该发
在 C# 中,如果 A 实现 IX 并且 B 继承自 A ,是否必然遵循 B 实现 IX?如果是,是因为 LSP 吗?之间有什么区别吗: 1. Interface IX; Class A : IX;
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在阅读标准haskell库的(^)的实现代码: (^) :: (Num a, Integral b) => a -> b -> a x0 ^ y0 | y0 a -> b ->a expo x0
我将把国际象棋游戏表示为 C++ 结构。我认为,最好的选择是树结构(因为在每个深度我们都有几个可能的移动)。 这是一个好的方法吗? struct TreeElement{ SomeMoveType
我正在为用户名数据库实现字符串匹配算法。我的方法采用现有的用户名数据库和用户想要的新用户名,然后检查用户名是否已被占用。如果采用该方法,则该方法应该返回带有数据库中未采用的数字的用户名。 例子: “贾
我正在尝试实现 Breadth-first search algorithm , 为了找到两个顶点之间的最短距离。我开发了一个 Queue 对象来保存和检索对象,并且我有一个二维数组来保存两个给定顶点
我目前正在 ika 中开发我的 Python 游戏,它使用 python 2.5 我决定为 AI 使用 A* 寻路。然而,我发现它对我的需要来说太慢了(3-4 个敌人可能会落后于游戏,但我想供应 4-
我正在寻找 Kademlia 的开源实现C/C++ 中的分布式哈希表。它必须是轻量级和跨平台的(win/linux/mac)。 它必须能够将信息发布到 DHT 并检索它。 最佳答案 OpenDHT是
我在一本书中读到这一行:-“当我们要求 C++ 实现运行程序时,它会通过调用此函数来实现。” 而且我想知道“C++ 实现”是什么意思或具体是什么。帮忙!? 最佳答案 “C++ 实现”是指编译器加上链接
我正在尝试使用分支定界的 C++ 实现这个背包问题。此网站上有一个 Java 版本:Implementing branch and bound for knapsack 我试图让我的 C++ 版本打印
在很多情况下,我需要在 C# 中访问合适的哈希算法,从重写 GetHashCode 到对数据执行快速比较/查找。 我发现 FNV 哈希是一种非常简单/好/快速的哈希算法。但是,我从未见过 C# 实现的
目录 LRU缓存替换策略 核心思想 不适用场景 算法基本实现 算法优化
1. 绪论 在前面文章中提到 空间直角坐标系相互转换 ,测绘坐标转换时,一般涉及到的情况是:两个直角坐标系的小角度转换。这个就是我们经常在测绘数据处理中,WGS-84坐标系、54北京坐标系
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .Net 7 下进行一次简单的演示. PeriodicTimer .
二分查找 二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置。
我是一名优秀的程序员,十分优秀!