- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试解决 2 个字符串之间的最大公共(public)子串问题。我将把我的问题简化为以下内容:我创建了一个 general suffix tree根据我的理解,最大的公共(public)子串是由属于两个字符串的节点组成的最深路径。
我的测试输入是:
String1 = xabc
String2 = abc
看起来我构建的树是正确的,但我的问题是以下方法(我最初传递树的根):
private void getCommonSubstring(SuffixNode node) {
if(node == null)
return;
if(node.from == ComesFrom.Both){
current.add(node);
}
else{
if(max == null || current.size() > max.size()){
max = current;
}
current = new ArrayList<SuffixNode>();
}
for(SuffixNode n:node.children){
getCommonSubstring(n);
}
}
我的目标是,为了找到节点同时属于两个字符串的最深路径,我将遍历树(预排序)并在列表中添加属于两个字符串的节点(当前
)。一旦我进入一个不属于两者的节点,如果 current
更大,我更新 max
列表。
但是代码是错误的。而且我对如何实现这一点感到困惑,因为我已经很久没有为一般(非二叉)树编写代码了。
你能帮我解决这个问题吗?
更新:
根据@templatetypedef 修改。也无法使这项工作。
private void getCommonSubstring(SuffixNode node, List<SuffixNode> nodes) {
if(node == null)
return;
if(node.from == ComesFrom.Both){
nodes.add(node);
}
else{
if(max == null || current.size() > max.size()){
max = nodes;
}
nodes = new ArrayList<SuffixNode>();
}
for(SuffixNode n:node.children){
List<SuffixNode> tmp = new ArrayList<SuffixNode>(nodes);
getCommonSubstring(n, tmp);
}
}
public class SuffixNode {
Character character;
Collection<SuffixNode> children;
ComesFrom from;
Character endMarker;
}
最佳答案
我在这里看到的一个问题是后缀树中节点的深度 与沿该路径的字符串的长度 不同。后缀树中的每条边都用一系列字符进行注释,因此由一系列深度为五的节点编码的字符串可能比深度为二的字符串的长度更短。您可能需要调整您的算法来处理此问题,方法是跟踪您到目前为止构建的字符串的有效长度,而不是您到目前为止跟踪的路径中的节点数。
我刚刚注意到的第二个问题是,您似乎只有一个 current
变量,该变量在递归的所有不同分支之间共享。这可能会在递归调用中弄乱你的状态。例如,假设您在一个节点处并且有一条长度为三的路径,并且有两个 child - 第一个仅以第一个字符串的后缀结尾,第二个以以下后缀结尾两个字符串。在这种情况下,如果您对第一个字符串进行递归调用,您将最终执行该行
current = new ArrayList<SuffixNode>();
在递归调用中。然后这将清除所有历史记录,因此当您从此调用返回到原始节点并下降到第二个子节点时,您将表现得好像到目前为止没有建立节点列表,而不是继续从您目前找到的三个节点。
要解决这个问题,我建议将 current
作为函数的参数,然后在需要时创建一个新的 ArrayList
,而不是清除现有的 数组列表
。其他一些逻辑可能也必须更改才能解决这个问题。
鉴于此,我建议用这样的伪代码编写函数(因为我不知道您的后缀树实现的细节):
希望这对您有所帮助!
关于java - 坚持在一般树遍历中寻找最深路径试图找到最大的公共(public)子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146843/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!