- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个像这样的 4x4 二维字符数组:
A B C D
U A L E
T S U G
N E Y I
现在,我需要找到 3 个字符、4 个字符等的所有排列,直到 10。
因此,可以从中“找到”的一些词是 TEN
、BALD
、BLUE
、GUYS
.
我确实为此搜索过 SO 并用 Google 搜索过,但没有具体的帮助。你能把我推向我应该学习算法的正确方向吗(也许是 A*?)。请保持温和,因为我不是算法专家(不是我们所有人(好吧,至少是大多数 :)),但我愿意学习只是不知道从哪里开始。
最佳答案
啊哈,这就是 Boggle 游戏,不是吗...您不需要排列,您需要一个图表,并且您想在图表中找到单词。
好吧,我会先将字符安排为图形节点,然后将它们连接到它们的直接邻居和对角线邻居。
现在您只想搜索图表。对于 16 个起始节点中的每一个,您都将执行递归。当您移动到一个新节点时,您必须将其标记为正在使用,这样您就不能再次移动到它。当你离开一个节点(已经完全搜索它)时,你取消标记它。
我希望你明白这是怎么回事......
对于每个节点,您将访问它的每个邻居并将该字符添加到一个字符串中。如果您在构建字典时考虑了这种搜索,您将立即能够看到您目前拥有的字符是否是单词的开头。这很好地缩小了搜索范围。
我所说的字典类型是一棵树,其节点对应字母表中的每个字母都有一个子节点。这些的美妙之处在于您只需要存储您当前在搜索中到达的树节点。如果您确定找到了一个词,您只需通过父节点回溯以找出它是哪个词。
使用这种树形样式和深度优先图形搜索,您可以同时搜索所有可能的单词长度。这是我能想到的最有效的方法。
让我为您的图形搜索编写一个伪代码函数:
function FindWords( graphNode, dictNode, wordsList )
# can't use a letter twice
if graphNode.used then return
# don't continue if the letter not part of any word
if not dictNode.hasChild(graphNode.letter) then return
nextDictNode = dictNode.getChild(graphNode.letter)
# if this dictionary node is flagged as a word, add it to our list
nextDictNode.isWord()
wordsList.addWord( nextDictNode .getWord() )
end
# Now do a recursion on all our neighbours
graphNode.used = true
foreach nextGraphNode in graphNode.neighbours do
FindWords( nextGraphNode, nextDictNode, wordsList )
end
graphNode.used = false
end
当然,要开始整个事情:
foreach graphNode in graph do
FindWords( graphNode, dictionary, wordsList )
end
剩下的就是构建图形和字典。我只记得那个字典数据结构叫什么!这是一个Trie .如果你需要更节省空间的存储,你可以压缩成一个 Radix Tree或类似的,但到目前为止最简单(也是最快)的是直接使用 Trie。
关于algorithm - 4x4 二维字符矩阵排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14361583/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!