2つの文字列間の最大の共通部分文字列の問題を解決しようとしています。問題を次のように減らします。一般的な接尾辞木を作成しました。私の理解では、最大の共通サブ文字列は、両方の文字列に属するノードで構成される最も深いパスです。
私のテスト入力は次のとおりです。
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
場合はリストを更新します。current
しかし、コードは誤りです。そして、私はこれを実装する方法について混乱しています。なぜなら、私は昔から一般的な(非バイナリ)ツリーのコードを書いていなかったからです。
これを理解するのを手伝ってくれませんか。
更新:
@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;
}