Я пытаюсь решить проблему наибольшей общей подстроки между двумя строками. Я сведу свою проблему к следующему: я создал общее дерево суффиксов и, насколько я понимаю, самая большая общая подстрока — это самый глубокий путь, состоящий из узлов, принадлежащих обеим цепочкам.
Мой тестовый ввод:
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;
}